2016-08-10 30 views
-3

用下面的代碼爲什麼GCC聲明INT後consistenly沒有打印0

#include <stdio.h> 

int main() { 

    int num; 
    printf("%d\n", num); 

    int* num2; 
    printf("%p\n", &num2); 

    return 0; 
} 

我得到了類似結果:

enter image description here

Memory allocation for global and local variables, 我知道全局變量num初始化爲0, 即使它沒有被我初始化。

現在我只是想隨意的東西,所以我的代碼更改爲

#include <stdio.h> 

int main() { 

    int num; 
    printf("%d\n", num); 

    int* num2; 
    printf("%p\n", num2); 

    return 0; 
} 

,現在我得到

enter image description here

問題:我不知道爲什麼值num不再是0

在我看來,我在做什麼與變量num2及其值HAS 什麼都不做num

我不僅感興趣的原因,但也想聽聽你的意見 關於這種行爲。

回答

3
int num; 
printf("%d\n", num); 

int* num2; 
printf("%p\n", num2); 

在這兩種情況下,上面的你正在閱讀的未初始化變量的值(在一種情況下這個變量是簡單的整數,在其他條件下的指針 - 但是就像我在這兩種情況下說,他們的值不會被初始化)。

默認情況下,局部變量未初始化。

讀取未初始化變量的值爲undefined behavior

這是罰款

int* num2; 
printf("%p\n", &num2); 

因爲&numnum指針的地址 - 已定義的值。 雖然更正確的使用方法:

printf("%p\n", (void*) &num2); 

在其他情況下也,你用%p

+0

'讀取未初始化變量的值是未定義的行爲。只有當它們可以包含陷阱表示時,例如浮點數。不過,您可能會得到未定義的*結果*。 – wildplasser

+1

@wildplasser hm我認爲未讀初始化變量的讀取值通常稱爲UB:http://stackoverflow.com/documentation/c/364/undefined-behavior/2576/reading-an-uninitialized-object-that-is - 不支持內存#t = 201608101257444574981 –

+0

取消引用指針!=讀取變量。 – wildplasser

1

local變量沒有static關鍵字有automatic存儲期限。 num就是這樣一個變量。

automatic存儲讀取Varibale的值之前分配任何值可能會導致任何東西。所以你不能期望一些確定的輸出。

是的,因爲你的代碼是,你正在做什麼與變量num2和它的值與變量num沒有什麼關係。但num2num可以關聯,如果你做num2 = &num;,之後你分配給*num2將影響num的價值。