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