[英]how arrays are treated by gcc [ question related to C programing ]
即使在-Wall選項下,它也可以在gcc中進行編譯,沒有錯誤或警告,這意味着在運行時檢查數組范圍,因此編譯器無法檢測到錯誤
#include<stdio.h>
int main()
{
int a[2][3][4];
a[1][2][100] = 4 ;
return 0;
}
然而,
#include<stdio.h>
int main()
{
int a[2][3];
a[1][2][100] = 4 ;
return 0;
}
這會在編譯為時生成錯誤:
$ gcc sample.c -Wall
sample.c: In function ‘main’:
sample.c:7: error: subscripted value is neither array nor pointer
為什么會這樣呢? 在兩個代碼中,a [1] [2] [100]均無效。 編譯器仍然可以檢測到它是code2而不是code1。
特別是當每個編譯器將所有多維數組展平為相應的單維數組時,那么編譯器如何才能有選擇地意識到代碼中的這一缺陷。
我們將不勝感激地接受對其中適當解釋所在的某些書籍或文章的解釋或提及:)
首先,在運行時或編譯時不檢查數組邊界。 小心點。
其次,第二種情況會出錯,因為數組維數不匹配-在2D數組上使用了三個下標運算符( []
)。 僅僅因為數組恰好被安排在內存中作為數組的數組,並不意味着變量實際發生任何實際的變化。
數組下標在C標准第6.5.2.1節“ 數組下標”中進行了描述。
不同之處在於類型。 C不進行邊界檢查,但進行(靜態)類型檢查。 第一個示例中a的類型為int[][][]
但是第二個示例中a的類型為int[][]
。
您所指的“扁平化”發生在代碼生成中,即(至少在概念上)在類型檢查之后。
給定
int a[2][3];
編譯器將確定a[1][2]
的類型為int
。 因此,訪問此元素的元素[100]
等效於:
int x;
x[100] = 4;
這將給您關於下標值的相同錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.