2013-07-16 76 views
0

聲明簡單的結構:困惑與訪問內存的malloc(未初始化)

struct s { 
    char* addr; 
}; 

s *ips; 

現在在分配這些結構陣列存儲

num = 5 
ips = (r *) malloc(num * sizeof(r)); 

我知道剛纔的malloc分配內存,並沒有初始化,有可能是垃圾值。

現在我想知道如果我不初始化一個,並嘗試訪問會發生什麼?

//Init for 4 of them 
for(int i = 0; i < num-1; i++) 
    ips[i].addr = strdup("123"); 

//Accessing un-initialize one: 
if(ips[4].addr) { 
    printf("Accessing uninitialize one and lets say freeing!!!"); 
    free(ips[4].addr); 
} 

理想不應該進入這個循環。但是,我認爲,因爲它可能是垃圾值。我不確定!

+6

恭喜!你問了第1,000,000個「當我調用未定義的行爲時會發生什麼?」題!您的免費C標準副本在郵件中。 –

+0

[未定義,未指定和實現定義的行爲]的可能的重複(http://stackoverflow.com/questions/2397984/undefined-unspecified-and-implementation-defined-behavior) –

+3

只要你編寫不編譯的代碼你應該安全。 –

回答

1

會發生什麼將是不可預知的,因爲你不知道內存包含什麼。您應該使用calloc而不是mallocmemset調用malloc後的內存。

我個人更喜歡使用calloc,因爲它保存了一行代碼,並且稍後可以更輕鬆地閱讀代碼。

+0

'calloc'和'memset'都不能保證將指針設置爲null或浮點對象爲'0.0' 。 –

+0

@Keith Thompson你認爲'calloc()'不能保證爲NULL或0.0,這是因爲儘管內存是零填充的,NULL和0.0 _may_不只是由零位組成?或者還有別的嗎? – chux

+0

@chux:就是這樣。在最常見的實現中,空指針和浮點「0.0」都被表示爲全零位,但C標準並不能保證它。如果你打算編寫依賴於這個假設的代碼,我建議至少做出明確的假設。 (我寧願不依賴它;例如,'const foo_t foo_zero = {0};'給你一個類型爲'foo_t'的對象,所有成員都設置爲零(整數0,浮點數0.0,空指針,... ) –

0

初始化您的變量。

沒有初始化 - 所有投注都關閉。
ips[4].addr,就像你知道一樣,是未初始化的。所以使用:

// Various code 
... 
if(ips[4].addr) { 

是一種複雜的簡單方法,詢問以下內容:

int i; 
if (i) { 

每次運行該程序時,i的值可能相同。如果可能會不同。沒有理想的事情發生。這是簡單的未定義行爲(UB)。