초보 단일 연결리스트 질문좀 드려요~
글쓴이: jeun3786 / 작성시간: 목, 2012/11/08 - 9:40오전
typedef struct _list { char link[LINK_LEN]; struct _list *next; } list_t; int list_free(list_t *plist) { //list_t 동적할당 해제 if(plist == NULL) { printf("list_free()에서 plist는 NULL!\n"); return -1;; } while(plist != NULL) { //리스트의 next를 참조하며 동적할당 해제 free(plist); plist = plist->next; } return 0; }
안녕하세요~ 완벽한 코드는 아니고 단일 연결리스트 공부중에 잘 이해가 안되는 부분이 있어서 질문드립니다.
list_free()에서 plist는 malloc으로 동적할당 받은 메모리의 위치를 가리키고 있습니다.
근데 함수 내부에서 위와같이 free(plist)를 수행하고
plist = plist->next; 명령을 제대로 수행하던데
free(plist)를 하면 plist가 해제되어버려서 plist->next를 참조 못해야 한다고 생각했는데
제 생각과는 다르게 잘 동작을 하던데요. 혹시 제가 생각을 잘못하고 있었는지 지적좀 해주세요.
초보라서 나름 열심히 적었는데 두서없는 질문이었다면 죄송하구요..ㅠㅠ 그것역시 지적좀 해주세요.
Forums:
잘못된 코드 맞습니다.
C의 무서운 점은 "잘못된" 코드도 가끔씩 잘(?) 동작한다는 거죠.
다시 말해, C 컴파일러는 "잘못된 코드가 잘못 동작한다"를 절대 보장하지 않습니다. 일단 코드가 잘못되었으면 무슨 일이든 일어날 수 있습니다. (예를 들자면, 잘 동작하다가 사흘에 한번씩 뻗는다든지...)
감사합니다~
컴파일러에 대해 너무 믿음을 가지고 있었네요..
댓글 감사합니다! ^^
free 한다고 데이터가 지워지지 않습니다.
사용하지 않는다고 표시만 하는거죠.
그 사이에 데이터가 덮어써지지 않았으면 잘 동작하는겁니다.
그래도 조심하세요...
아 감사합니다~~
깜빡잊고 있었네요 ㅎㅎㅎ
잘못된 코드가 맞습니다.
다른 분들의 지적처럼, 분명 잘못된 코드가 맞으며, 경우에 따라서는 제대로 동작하기도 합니다.
문제가 되는 부분은 예상대로, 다음 코드의 관계입니다.
free(plist);
plist = plist->next;
우연찮게도 free(plist); 후에 context-switch 가 발생해서 다른 코드 수행 후에, 다음 문장을 수행하면 문제가 됩니다.
즉, thread-safe 하지 않는 코드입니다.
(jick님 말씀처럼 평소에 잘 동작하다가 사흘에 한번씩 뻗는 코드가 되는 겁니다.)
그리고, 한가지 더,
plist == NULL인 사항은 오류 조건이 아닌 정상적인 조건이라는 것입니다.
즉, empty list인 것이지요.
이런 경우에는 내부적인 처리만 하고, 정상적인 리턴값으로 처리하는 것이 바람직할 것으로 보입니다.
물론 경우에 따라서 empty list를 허용하지 않는다면, 오류 조건이 맞을 것 같고요.
참고하시기 바랍니다.
감사합니다~~
리스트 신경써야 될게 많네요 ㅠㅠ
free(p) 하고 나서는 p=NULL 같은 코드를
free(p) 하고 나서는 p=NULL 같은 코드를 넣어서 포인터 재참조하면 확실히 오류가 나게 만드는 습관을 가지시는 것이 좋습니다.
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
감사합니다~
좋은것 배우네요~~ 감사합니다!
댓글 달기