자기참고 구조체 에러
글쓴이: sjlee96 / 작성시간: 일, 2007/02/18 - 1:32오전
자기참조 구조체를 써서 뭘 좀 해보려고 하는데 에러 비스무리한 게 나는데, 디버깅이 어려워 도움을 구합니다.
박스안에 입자가 몇 개 있는 지 파악하는 프로그램 이예요.
번호가 매겨진 공이 1부터 1000까지 있는데, 박스 100개에 무작위로 들어가 있다고 보시면 됩니다.
C로 만들고 있고, Linux에서 Intel 컴파일러 이용하고 있어요.
구조체를 먼저 하나 선언했습니다.
typedef struct particles_in_this_box p_box; struct particles_in_this_box { long pID; //particle ID p_box* next; };
그 다음에 malloc()으로 메모리를 할당했죠.
NB는 박스의 총 갯수입니다.
p_box **cpib = (p_box **)malloc(NB * sizeof(p_box *)); //malloc으로 메모리 할당 bzero(cpib, NB * sizeof(p_box *)); //NULL로 초기화
다음에는 모든 입자의 갯수만큼 loop을 돌려서 해당 particle이 어느 박스에 있는지 '자기참조 구조체'(여기선,p_box* next가 되겠네요.)를 이용해서 쭈~욱 저장합니다.
nd는 모든 particle의 갯수입니다.
for(long i = 0; i < nd; i ++ ) { long boxID =look_for_boxID (i); //여기서는 문제가 없어요. 해당 i번째 입자가 몇 번 박스에 들어가 있는 지 제대로 알려주네요. p_box *tmp_cpib = (p_box *) malloc(sizeof( p_box )); tmp_cpib->pID = pID; tmp_cpib->next = cpib[boxID]; // 여기에서 문제가 나는 걸 알았어요. 주석으로 막았다 풀어보니 에러가 없다가 생겨버리네요. cpib[boxID] = tmp_cpib; free(tmp_cpib); }
이런 에러를 뱉어내요.
*** glibc detected *** double free or corruption (top): 0x08509710 *** make: *** [run] Aborted
이해가 잘 안됩니다. 고수님들 도움을 부탁드립니다.
Forums:
제가 바보같은 짓을 했네요.
tmp_cpib에 주소를 cpib에 넘겨 준다음에 tmp_cpib를 free해버리는 바람에 cpib에 할당한 주소를 그냥 날려버렸네요.
여기서 문제가... :-)
댓글 달기