2012-02-22 164 views
1

我有這個枚舉類型:自由堆損壞(...)

enum Cell { ALIVE='X', DEAD='O' }; 

而且我分配一個與它的數組:

h_board = (Cell*) malloc(width*height*sizeof(char)); 

我認爲我沒有這樣做錯誤,因爲單元格值是字符(我想留在char大小的數據,但我關心可讀性,這就是爲什麼我使用枚舉。)

free(h_board);引發異常。在調試模式下,我可以看到堆損壞警告。我想我釋放的內存比我分配的更多,但我看不出爲什麼。我也嘗試free((char*)h_board);試圖強制char大小釋放,但問題仍然存在。

我該如何解決這個問題?

+0

您正在覆蓋某處。顯示一些代碼? – cnicutar 2012-02-22 13:11:02

+0

h_board的類型是什麼?我認爲它是'Cell *'。 Valgrind告訴你什麼?你可以把最小代碼重新創建這個問題,並告訴我們什麼發生在h_board? – Eregrith 2012-02-22 13:11:35

+0

我還沒有看到任何錯誤,但是您最好使用'sizeof(Cell)'而不是'sizeof(char)'。 – kennytm 2012-02-22 13:12:09

回答

4

首先,Cell是它自己的數據類型(這並不一定映射到char),所以使用malloc與(加上,我們不是在C投malloc):

Cell *h_board = malloc(width * height * sizeof(Cell)); 

二,我們需要完整的代碼才能夠準確地幫助您。這應該運行沒有任何錯誤,也許你可以從這裏建立:

#include <stdlib.h> 

int main(int argc, char **argv) { 
    Cell *h_board; 

    h_board = malloc(20 * 30 * sizeof(*h_board)); 
    free(h_board); 

    return 0; 
} 
+0

我不知道我需要發佈更多的代碼,這就是我需要的。謝謝。我只是想強制枚舉字符大小......但我想我不能。 – kaoD 2012-02-22 13:16:42

+1

kaoD:枚舉的全部目的是使類型安全的簡單數值常量具有良好的性能。編譯器選擇'int'比邏輯更合理,因爲這通常是實現中的字大小,而字大小是CPU處理速度最快的。如果你想要的類型爲'char'的常量,你仍然可以寫'const char ALIVE ='x';'等等 – orlp 2012-02-22 13:18:21

+0

順便說一句,不要強制轉換爲'Cell *'將不起作用。說實話,我不確定這是C還是C++(我正在爲CUDA編程),但是我需要將它投射出去。 – kaoD 2012-02-22 13:19:54