2012-02-22 2 views
1

나는이 열거 유형이 있습니다힙 손상 (...)

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

을 그리고 나는 그것으로 배열 할당 :

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

내가이 일을 아니에요 가정을 잘못된 값은 문자입니다. char 크기의 데이터를 유지하고 싶지만 가독성을 신경 쓰고 있습니다. 따라서 enum을 사용했습니다.

free(h_board);에 예외가 발생합니다. 디버깅 모드에서 힙 손상 경고를 볼 수 있습니다. 할당하는 것보다 더 많은 메모리를 확보 할 수는 있지만 이유를 알 수는 없습니다. 나는 또한 free((char*)h_board); 문자 크기 할당 취소를 시행하려고 시도했지만 문제가 지속됩니다.

어떻게 해결할 수 있습니까? 모든

+0

어딘가에 겹쳐 쓰고 있습니다. 몇 가지 코드를 보여 주시겠습니까? – cnicutar

+0

h_board의 유형은 무엇입니까? 나는 그것이'Cell * '이라고 가정한다. Valgrind가 뭐라고 말하니? 이 문제를 재현하고 h_board에 어떤 일이 일어나는지 보여줄 수있는 최소한의 코드를 넣을 수 있습니까? – Eregrith

+0

아직 아무것도 보이지 않지만 sizeof (char) 대신'sizeof (Cell)'을 사용하는 것이 좋습니다. – kennytm

답변

4

첫째, Cell는 (반드시 char에 매핑되지 않음) 때문에 (더하기, 우리는 C에서 malloc 캐스팅하지 않음) 그와의 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

더 많은 코드를 게시 할 필요가 있는지 확신 할 필요가 없습니다. 감사. 난 그냥 열거 형에 대한 char 크기를 적용하고 싶었지만 ...하지만 난 그냥 할 수 없다고 생각합니다. – kaoD

+1

kaoD : 열거 형의 목적은 좋은 성능을 제공하는 유형 안전성있는 숫자 상수를 만드는 것입니다. 컴파일러가 보통'int'를 선택하는 것은 논리적 인 것 이상입니다. 왜냐하면 이것은 보통 구현의 워드 크기이고 워드 크기는 CPU를 처리하는 데 가장 빠르기 때문입니다. 'char' 타입의 상수를 원한다면'const char ALIVE = 'x';'등등을 쓸 수 있습니다. – orlp

+0

그런데'Cell *'으로 캐스팅하지 않으면 작동하지 않습니다. 솔직히 말해서, 이것이 C 또는 C++인지 확실하지 않습니다. (저는 CUDA를 위해 progamming하고 있습니다.)하지만 저는 그것을 캐스팅해야합니다. – kaoD