首頁 >後端開發 >C++ >為什麼在 C/C 中將 2D 數組視為 1D 數組會導致未定義的行為?

為什麼在 C/C 中將 2D 數組視為 1D 數組會導致未定義的行為?

Patricia Arquette
Patricia Arquette原創
2024-12-15 17:48:12971瀏覽

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