微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

原文地址:https://www.jb51.cc/c/111615.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐