2012-10-12 105 views
0

在這個簡單的數組初始化中,我找不到有什麼問題。 程序崩潰與field[x][y] = ' ';,X段錯誤和y在0(我用的代碼:: Blocks的調試器)初始化2d數組時出現Segfault

/* init data structures */ 
char **field; 
int field_width=5,field_height=5; 
field = malloc(sizeof(char*)*field_width); 
for(x=0;x<field_width;x++) 
{ 
    field[x] = malloc(sizeof(char)*field_height); 
    for(y=0;y<field_height;y++) 
    { 
     field[x][y] = ' '; 
    } 
} 

什麼我做錯了任何想法?

+1

此代碼片段不會爲我崩潰。 – Neil

+0

對我來說看起來不錯 –

回答

1

我實際上簡化了代碼片段。 field_width未初始化。我很驚訝這沒有提出警告,在構建過程中。我真的不知道爲什麼當x = 0時它會產生段錯誤。

但我的問題解決了。謝謝大家,併爲此表示歉意...

+0

使用未初始化的'field_width',可能碰巧有一個很大的值,所以'malloc'失敗。你在真實代碼中檢查了'malloc'的返回值嗎? –

+0

我沒有檢查。根據你的建議,我做到了,事實上,那是失敗的。感謝您的建議。我必須記住的另一個好習慣! – Cyctemic

1
field = (char*) malloc(sizeof(char*)*field_width); 

char*演員表可能?

+1

在(ANSI)C中,不需要施加malloc的結果。請參閱http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc – reima

+1

與C++不同,您不需要將'void *'顯式地轉換爲C中的另一個指針。 – Neil

0

不是這樣嗎?

field = (char**)malloc(sizeof(char*)*field_width); 

編輯

malloc可以返回空值,所以它將支付檢查的內存field[x] = malloc(sizeof(char)*field_height);塊是有效的。

+1

與C++不同,你不需要顯式地從'void *'強制轉換爲C中的另一個指針。 – Neil

0

在初始化field_width之前,它可能包含隨機數據。在malloc聲明中使用field_width,然後使用triggered undefined behavior。編譯器可以做任何想做的事情,從跳過malloc到使用任何垃圾發生在field_width中,或者甚至更糟糕/陌生的東西!無論如何,你不太可能得到你想要的malloc電話,如果它沒有運行或返回NULL(例如,如果field_width包含的值太大而不能成爲malloc ed),則產生的值field不太可能指向有效的記憶。這會在循環中取消引用field時導致段錯誤。你很幸運,你有這樣一個明顯的跡象表明有什麼錯 - 記憶錯誤並不總是如此公然。