[英]Why does this simple C code print the addresses in the reverse order ? (For Ex. 4214868 4214864)
[英]Why does this code print addresses?
為什么在意外打印2D陣列的一個維度時沒有出現編譯時錯誤?
#include <stdio.h>
void main() {
int i;
int arr[2][3] = { 1, 2, 3, 4, 5, 6 }; //<- Declared a 2D array
for (i = 0; i < 6; i++) {
printf("%d\n", arr[i]); // <- Accidently forgot a dimension
}
}
我應該收到編譯時錯誤,但我得到了一組地址! 為什么? arr[0]
在這個上下文中對編譯器意味着什么?
數組類型的表達式求值為大多數上下文中指向第一個數組元素的指針 (一個值得注意的例外,其中一個是sizeof
運算符)。
在您的示例中, arr[i]
具有數組類型。 所以它計算為int (*)[]
類型的指針(指向數組的指針)。 這就是印刷品。 使用%d
打印指針是未定義的行為 ,因為printf()
將讀取指針,就好像它是一個int
。
Felix Palmen的回答解釋了觀察到的行為。
關於你的第二個問題:你沒有得到警告的原因是你沒有要求他們。
眾所周知,編譯器在默認情況下是寬松的,並且會接受包含明顯未定義行為的損壞代碼。 這個特殊的一個並不明顯,因為printf()
在初始格式字符串之后接受任意數量的額外參數。
您可以指示編譯器發出許多有用的警告,以避免愚蠢的錯誤並檢測非明顯的編程錯誤。
gcc -Wall -Wextra -Werror
clang -Weverything -Werror
/W3
或/W4
。 gcc
和clang
會抱怨數組arr
的草率初始化程序。 它應該是:
int arr[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };
打印循環確實令人驚訝,你真的想用一個循環打印數組嗎?
另請注意,不帶參數的main
的標准原型是int main(void)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.