首页 >后端开发 >C++ >为什么在 C/C 中将 2D 数组视为 1D 数组会导致未定义的行为?

为什么在 C/C 中将 2D 数组视为 1D 数组会导致未定义的行为?

Patricia Arquette
Patricia Arquette原创
2024-12-15 17:48:12967浏览

Why Does Treating a 2D Array as a 1D Array in C/C   Lead to Undefined Behavior?

将二维数组视为一维数组:未定义的行为

在 C 和 C 语言中,多维数组在内存中连续存储。但是,使用单维索引访问多维数组可能会导致未定义的行为。

请考虑以下代码:

int a[25][80];
a[0][1234] = 56; // Line 2
int* p = &a[0][0];
p[1234] = 56; // Line 4

第 2 行:
This line 尝试访问数组 a[25][80] 范围之外的元素。 a 的第一个维度的大小为 25,但第 2 行尝试访问第 1235 个元素,该元素超出了有效范围。这会导致未定义的行为,因为它违反了语言定义。

第 4 行:
此行也会触发未定义的行为。数组 a 有 25 * 80 = 2000 个元素,而 p 指向数组的开头。因此,表达式 p[1234] 尝试访问数组的第 1235 个元素,该元素超出了有效范围。使用超出数组范围的指针为数组添加下标被视为未定义行为。

常量表达式:
上述代码中的未定义行为也体现在常量表达式中。以下代码将因未定义行为而无法编译:

constexpr int f(const int (&a)[2][3])
{
    auto p = &a[0][0];
    return p[3]; // Undefined behavior
}
int main()
{
    constexpr int a[2][3] = { 1, 2, 3, 4, 5, 6, };
    constexpr int i = f(a);
}

这表明常量表达式中的未定义行为仍然是非法的,编译器将拒绝此类代码。

以上是为什么在 C/C 中将 2D 数组视为 1D 数组会导致未定义的行为?的详细内容。更多信息请关注PHP中文网其他相关文章!

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