2014-03-29 86 views
0

有沒有人知道我的程序爲什麼在下面的情況下打印-69?我期望它用C語言打印未初始化原始數據類型的默認/垃圾值。謝謝。我可以重新初始化全局變量以覆蓋C中的值嗎?

#include<stdio.h> 

int a = 0; //global I get it 
void doesSomething(){ 
    int a ; //I override global declaration to test. 
    printf("I am int a : %d\n", a); //but I am aware this is not. 
    a = -69; //why the function call on 2nd time prints -69? 
} 

int main(){ 
    a = 99; //I re-assign a from 0 -> 99 
    doesSomething(); // I expect it to print random value of int a 
    doesSomething(); // expect it to print random value, but prints -69 , why?? 
    int uninitialized_variable; 
    printf("The uninitialized integer value is %d\n", uninitialized_variable); 
} 

回答

4

你有什麼是不確定的行爲,你無法事先預測的未定義行爲的行爲。

但是,這種情況很容易理解。 doesSomething函數中的局部變量a被放置在堆棧中的特定位置,並且該位置在調用之間不會改變。所以你看到的是以前的價值。

如果你之間已經調用了其他東西,你會得到不同的結果。

+0

:這裏是流「A」與2次呼叫doesSomethnig的:讓圖像並作爲堆棧> A =垃圾,(打印垃圾),a =(-69),退出循環,我假設自動變量被釋放並且棧被清除,但是你提到的'a'位置的參數不會改變,在第二次調用doesSomething:a =垃圾,然後打印一個=>它應該打印垃圾。爲什麼要打印(-69),垃圾值現在在堆棧頂部,不是嗎? –

2

是的..你的函數重用兩次相同的內存段。所以,第二次你調用「doesSomething()」時,變量「a」仍然是「隨機的」。例如下面的代碼填充調用另一個函數的兩個電話之間,你的操作系統會給你differen段:

#include<stdio.h> 

int a = 0; //global I get it 
void doesSomething(){ 
    int a; //I override global declaration to test. 
    printf("I am int a : %d\n", a); //but I am aware this is not. 
    a = -69; //why the function call on 2nd time prints -69? 
} 

int main(){ 
    a = 99; //I re-assign a from 0 -> 99 
    doesSomething(); // I expect it to print random value of int a 
    printf("edadadadaf\n"); 
    doesSomething(); // expect it to print random value, but prints -69 , why?? 
    int uninitialized_variable; 
    printf("The uninitialized integer value is %d\n", uninitialized_variable); 
} 
在堆殼