將二維數組視為一維數組:未定義的行為
在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中文網其他相關文章!