簡體   English   中英

為什么這段代碼打印地址?

[英]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
  • 使用Microsoft Visual Studio選項/W3/W4

gccclang會抱怨數組arr的草率初始化程序。 它應該是:

int arr[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };

打印循環確實令人驚訝,你真的想用一個循環打印數組嗎?

另請注意,不帶參數的main的標准原型是int main(void)

暫無
暫無

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

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