自由堆损坏(...)

问题描述:

我有这个枚举类型:自由堆损坏(...)

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

首先,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

它应该是sizeof(细胞)。对枚举的大小做任何假设都可能是危险的。 仅供您参考:What is the size of an enum in C?