二维数组可以被视为连续的一维数组吗?
C 中的下标会导致指针加法,然后间接寻址。考虑以下代码:
int a[25][80]; a[0][1234] = 56; int* p = &a[0][0]; p[1234] = 56;
第二行是否调用未定义的行为?那么第四行呢?
答案:
这两行都会导致未定义的行为。
根据 C标准情况下,仅当结果索引位于数组范围内时,向数组元素添加指针才会产生有效行为。在本例中,a[0] 的大小为 80,超出此范围的索引未定义。
说明:
下标相当于以下内容:
a[0][1234] == *(a[0] + 1234)
由于a[0]指向a的第一行第一个元素,所以指针加a[0] 1234 试图访问超出行尾的元素。这会导致未定义的行为。
类似地,第四行尝试修改行边界之外的值:
p[1234] == *(p + 1234)
即使 p 指向 a 的第一个元素,尝试修改超出其基础行范围的元素会导致未定义的行为。
需要注意的是,这种类型的未定义行为不会被检测到编译器。因此,必须确保指针算术运算在运行时保持在有效数组元素的范围内。
以上是在 C 中将 2D 数组作为连续的 1D 数组访问是未定义的行为吗?的详细内容。更多信息请关注PHP中文网其他相关文章!