Rai*_*dex 3 c++ segmentation-fault memory-layout nullptr
假设我正在迭代一个数组,但超出了这个数组,因为我的循环很愚蠢。
如果内存中的对象直接位于与该数组相同类型的该数组之后,
检查可以array[invalid_index] == nullptr
保护我吗?
检查索引(大小未知)是否对 C 数组有效的正确方法是什么?
无法通过指向数组第一个元素的指针来确定数组的大小。您需要以某种方式传达大小。
常见的策略是将数组保留为数组并通过类型系统传达大小,将大小作为单独的值提供或使用标记值(如 ac 字符串中的空字符)。在 c++ 中,建议使用std::vector
or std::array
which 总是知道自己的大小。
尝试取消引用超出该数组边界的数组元素是未定义的行为。一旦您尝试阅读,array[invalid_index]
您就会有未定义的行为。所以不可能array[invalid_index]
用于任何有用的目的,包括边界检查。nullptr
在这里根本没有影响。
不,检查nullptr
并不能保护您。在所有。0%。
是您创建了有问题的数组。检查索引是否有效的正确方法是知道您创建的数组的大小(您所做的;记住:创建数组的是您),然后检查索引是否在范围内。更好的是,编写代码以使索引首先不会超出范围,因此,开始时不需要检查......
除了数组最后一个元素之后的假设元素之外,单独尝试甚至只是计算(甚至不是访问,只是计算)不属于数组的元素的地址会立即调用未定义的行为[expr.add] /4。而且,无一例外,尝试访问实际上不是数组元素的元素总是会调用未定义的行为,无论如何。100%。内置下标运算符只是计算给定元素的地址并访问该地址[expr.sub]/1处的对象的简写。因此,在进入未定义行为领域之前,您实际上甚至无法比较读取的值nullptr
……