2013-02-10 58 views
0

我遇到了這個問題,我的結構指針總是默認初始化爲nil。以下是我的代碼。結構指針總是初始化爲零

#include <stdio.h> 

struct SomeStruct { 
    int x; 
}; 

int main() 
{ 
    int array[2]; // If I change this to 1, the code works fine 

    struct SomeStruct *ptr; 
    printf("%p\n", ptr); // always prints "nil" 
} 

有人可以請解釋這裏發生了什麼。具體來說,爲什麼將數組的大小更改爲1會使代碼正常運行。

上面是一些較大的代碼的一部分,我能夠簡化這個問題。稍後我需要使用ptr,但由於它是nil,我得到了分段錯誤。

+0

如果複製此代碼,此結果並嘗試1或2像你評論說,它將是相同=>(無)。你的ptr沒有設置爲任何值,所以它可能會使用目前堆棧中的垃圾值... – 2013-02-10 13:05:52

回答

2

有人可以請解釋這裏發生了什麼。具體來說,爲什麼將數組的大小更改爲1會使代碼正常運行。

您正在使用ptr而未初始化它。改變數組的大小會改變堆棧的佈局,並且你的代碼運氣很好地執行。

我以後需要PTR使用,但我得到分段錯誤,因爲它是零

然後分配一些內存給它:

ptr = malloc(sizeof *ptr); 
+0

非常感謝!最奇怪的問題,我可以問:( – Vivek 2013-02-10 11:45:29

+0

而不是ptr = malloc(sizeof(struct somestruct)); – LtWorf 2013-02-10 12:10:30

+3

@LtWorf我更喜歡我的版本,非常感謝你,因爲它仍然會做正確的事情,如果有人改變'ptr'類型。 – cnicutar 2013-02-10 12:10:50

1

您正在訪問一個未初始化的變量,因此您依賴於未定義的行爲;結果可能是什麼。

實際上,當程序運行時,您會看到垃圾堆棧中的任何垃圾。