将二维数组视为一维数组:未定义的行为
在 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中文网其他相关文章!