2013-02-05 111 views
0

它通常知道堆棧中的東西默認情況下未初始化。我試圖用堆棧中的struct來證明,但意外的是我的指針初始化爲null,但是爲什麼?什麼是初始化這個指針?誰在堆棧中的結構中初始化字符指針

#include <stdio.h> 
#include <string.h> 

struct strustri { 
    int var1; 
    char *var2; 
}; 

int main() 
{ 
    struct strustri test1 = { 
      .var1 = 12, 
      .var2 = "Teststring", 
    }; 
    struct strustri test2; 

    printf("test1.var1 is %d\n", test1.var1); 
    printf("test2.var1 is %d\n", test2.var1); 

    printf("test1.var2 points to %p\n", test1.var2); 
    printf("test2.var2 points to %p\n", test2.var2); 
    return 1; 
} 

這是我的機器(Ubuntu的12.10)的輸出:

test1.var1 is 12 
test2.var1 is -1271814320 
test1.var2 points to 0x400634 
test2.var2 points to (nil) 

我跑我的例子多次。我得到VAR1每次另一個價值,但VAR2總是指向零(空指針)...

+4

要知道,即使是停止的時鐘每天兩次顯示正確的時間。 –

+0

是的,但我跑了幾次程序。所有其他地址洗牌,所以我認爲它是不可能的,它總是零...... – falstaff

+0

未定義的行爲可能只是偶爾讓你感到驚訝。 – Sebivor

回答

7

沒有被初始化。

這只是什麼垃圾恰好是在棧上的假象。切換變量聲明的順序,或者添加更多的局部變量,並且會得到不同的結果。

+0

你說得對。只要我切換訂單,指針在程序的每次運行中都指向垃圾。 – falstaff

0

如果你把你的測試結構在一個單獨的功能,然後有一個創建字符數組的另一個功能,比如200個字節長,您填寫的一些信件,並調用兩個功能交替,你會發現,你在test2中的值將會不同[最有可能,但不是100%保證 - 因爲我們正在處理「未定義的行爲」,否則可能發生其他事情)。

當執行INT VAR1創造test2的空間
0

,它具有爲自己創造空間,但如果你不分配一個值給它,然後它會顯示這是已經存在的價值..

但在var2的情況下,它是一個指針。如果指針沒有初始化,那麼它不指向任何東西,使之成爲零或NULL或「\ 0」

+0

是的,但由於默認情況下堆棧上的指針未初始化,它*應該*指向一個隨機地址...這是我的預期... – falstaff