首页 >后端开发 >C++ >在 C 中将 2D 数组作为连续的 1D 数组访问是未定义的行为吗?

在 C 中将 2D 数组作为连续的 1D 数组访问是未定义的行为吗?

DDD
DDD原创
2024-12-22 02:08:15692浏览

Is Accessing a 2D Array as a Contiguous 1D Array in C Undefined Behavior?

二维数组可以被视为连续的一维数组吗?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn