c – 什么架构计算无效指针不安全?

前端之家收集整理的这篇文章主要介绍了c – 什么架构计算无效指针不安全?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
int* a = new int[5] - 1;

该行本身根据C标准调用未定义的行为,因为a是无效的指针,而不是一个过去的结束.同时,这是一个零开销的方式,使一个基于1的数组(第一个元素是[1]),我需要一个project of mine.

我想知道这是否是我需要避免的事情,或者如果C标准只是保守地支持一些奇怪的架构,我的代码永远不会运行.所以问题是,什么架构这将是一个问题?其中有哪些普遍存在?

编辑:看到上面的行确实调用未定义的行为,看看this question.

编辑:Dennis Zickefoose指出,当调用未定义的行为时,编译器被允许执行任何操作,因此编译器和cpu都必须提供超出C标准的保证,以便这样的代码工作.我正在扩大问题,即现代C编译器是否有这个问题.

解决方法

用于执行检查的硬件存在于所有x86处理器中,我们目前还没有在最流行的操作系统中使用它.

如果您使用分段存储器架构,我们对16位系统进行了分配,则分配不太可能返回地址段:0.在这种情况下,您无法从该地址中减去任何东西!

这是阅读关于分段内存的原因,为什么加载无效的段是不可能的:

http://en.wikipedia.org/wiki/Segment_descriptor

你必须决定这不可能发生在你的代码,或者你可能定义一个重载的操作符[]来处理你的偏移量.

猜你在找的C&C++相关文章