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&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...