簡體   English   中英

訪問多維數組的元素是否超出了未定義的行為范圍?

[英]Is accessing an element of a multidimensional array out of bounds undefined behavior?

請原諒令人困惑的問題標題,但我不確定如何更清楚地表達它。

在 C 中,越界訪問數組被歸類為未定義行為。 但是,數組元素保證在 memory 中連續布局,並且數組下標運算符是指針運算的語法糖(例如x[3] == *(x + 3) )。 因此,我個人希望下面代碼的行為是明確定義的:

int array[10][10];
int i = array[0][15]; // i == array[1][5]?

如果我對標准的解釋是正確的,這將是未定義的行為。 我錯了嗎?

根據標准,這顯然是未定義的行為,因為這種情況在第J.2 節未定義行為中明確列出(可在在線 C99 標准草案中找到):

數組下標超出范圍,即使 object 顯然可以使用給定的下標訪問(如在給定聲明int a[4][5]的左值表達式a[1][7]中)(6.5.6)。

您的示例仍然可以工作,實際上我在 C 代碼中看到了很多這樣的情況; 但是,准確地說,是UB。

該標准非常明確地給出了unsigned char arr[10][10]; ,如果x超過 9,訪問arr[0][x]的嘗試將產生 UB。

然而,我認為同樣清楚的是,該標准的作者打算允許代碼將任何 object 的地址(包括多維數組)作為字符指針,然后索引該指針以訪問object。

如果標准說arr[0]產生一個char*類型的指針,它只能用於訪問前十個元素,但(char*)arr會產生一個可以訪問整個數組的指針,那將適應上述兩個目標,但我在標准中沒有看到任何表明arr[0](char*)arr彼此不等價的內容。

最有可能的是,標准的作者期望實現會在這種極端情況下尋求明智的行為,無論標准是否充分描述了它們。 我不確定 clang 和 gcc 是否符合對這個特定問題的這種期望,但這種期望通常並不成立。

正如其他答案已經指出標准說這是UB的地方,我將添加其他答案中未討論的內容。

由於運算符優先級,表達式arr[0][15]等價於(a[0])[15]

現在由於超出一維 arrays 的范圍是未定義的行為,因此使用與(arr[0])[15]相同的表達式arr[0][15] ] 也是 UB,因為15大於10 in你的例子。

基本上,由於超出一維數組的范圍是未定義的行為,這意味着如果表達式(arr[i])[j]== arr[i][j]中的任何索引ij超出范圍xrange - 1 = 10 - 1 = 9yrange - 1 = 10 - 1 = 9 (對於您給定的示例),我們將有未定義的行為。

注意xrangeyrange是您指定為數組的行和列的初始大小的簡寫,在您的示例中對應於1010

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM