2012-10-24 27 views
0

爲什麼執行此代碼時堆會損壞?我還沒有用過很多內存分配。嘗試釋放二維數組時堆損壞

#include <stdlib.h> 

void main() 
{ 
    char **field, x, _fieldsX, _fieldsY; 

    _fieldsX = 8; 
    _fieldsY = 16; 

    // Allocation 
    field = malloc(sizeof(char*) * _fieldsX); 
    for (x = 0; x < _fieldsY; x++) 
     field[x] = malloc(sizeof(char) * _fieldsY); 

    // Freeing 
    for (x = 0; x < _fieldsY; x++) 
     free(field[x]); 
    free(field); 
} 
+1

令人難以置信,多快我得到這麼多答案!偉大的社區! 是否可以刪除問題?這一點非常明顯 - 我認爲這對其他人來說不是很有用。 – user1771164

+0

1)int main(void)2)不要使用帶前導下劃線的變量名,它們是保留的。 3)按照定義,sizeof(char)== 1。 4)避免使用char作爲索引;編譯器應該警告這一點。 – wildplasser

+0

1)我知道我必須這樣做一個適當的控制檯應用程序。此代碼將成爲MC的應用程序的一部分。 2)謝謝。不知道。 3)對。我只是總是使用sizeof。這是一個性能劣勢? 4)爲什麼我不應該這樣做來節省內存? – user1771164

回答

1

你走出分配區域的第一循環中界:

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

for (x = 0; x < _fieldsY; x++) 
    field[x] = malloc(sizeof(char) * _fieldsY); 

注意,您被分配_fieldsX項目,但循環將_fieldsY次以上該區域。

+0

男人..不知道我怎麼看不到這一點。謝謝! – user1771164

0

該代碼將字段長度分配爲_fieldsX,但設置_fieldsY元素。這是不正確的。