检查 nullptr 100% 是否可以防止有关内存布局的段错误?

Rai*_*dex 3 c++ segmentation-fault memory-layout nullptr

假设我正在迭代一个数组,但超出了这个数组,因为我的循环很愚蠢。
如果内存中的对象直接位于与该数组相同类型的该数组之后,
检查可以array[invalid_index] == nullptr
保护我吗?

检查索引(大小未知)是否对 C 数组有效的正确方法是什么?

Fra*_*eux 9

无法通过指向数组第一个元素的指针来确定数组的大小。您需要以某种方式传达大小。

常见的策略是将数组保留为数组并通过类型系统传达大小,将大小作为单独的值提供或使用标记值(如 ac 字符串中的空字符)。在 c++ 中,建议使用std::vectoror std::arraywhich 总是知道自己的大小。

尝试取消引用超出该数组边界的数组元素是未定义的行为。一旦您尝试阅读,array[invalid_index]您就会有未定义的行为。所以不可能array[invalid_index]用于任何有用的目的,包括边界检查。nullptr在这里根本没有影响。


Mic*_*zel 6

不,检查nullptr并不能保护您。在所有。0%。

是您创建了有问题的数组。检查索引是否有效的正确方法是知道您创建的数组的大小(您所做的;记住:创建数组的是),然后检查索引是否在范围内。更好的是,编写代码以使索引首先不会超出范围,因此,开始时不需要检查......

除了数组最后一个元素之后的假设元素之外,单独尝试甚至只是计算(甚至不是访问,只是计算)不属于数组的元素的地址会立即调用未定义的行为[expr.add] /4。而且,无一例外,尝试访问实际上不是数组元素的元素总是会调用未定义的行为,无论如何。100%。内置下标运算符只是计算给定元素的地址并访问该地址[expr.sub]/1处的对象的简写。因此,在进入未定义行为领域之前,您实际上甚至无法比较读取的值nullptr……