초보 단일 연결리스트 질문좀 드려요~

jeun3786의 이미지

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를 참조 못해야 한다고 생각했는데

제 생각과는 다르게 잘 동작을 하던데요. 혹시 제가 생각을 잘못하고 있었는지 지적좀 해주세요.

초보라서 나름 열심히 적었는데 두서없는 질문이었다면 죄송하구요..ㅠㅠ 그것역시 지적좀 해주세요.

jick의 이미지

C의 무서운 점은 "잘못된" 코드도 가끔씩 잘(?) 동작한다는 거죠.

다시 말해, C 컴파일러는 "잘못된 코드가 잘못 동작한다"를 절대 보장하지 않습니다. 일단 코드가 잘못되었으면 무슨 일이든 일어날 수 있습니다. (예를 들자면, 잘 동작하다가 사흘에 한번씩 뻗는다든지...)

jeun3786의 이미지

컴파일러에 대해 너무 믿음을 가지고 있었네요..

댓글 감사합니다! ^^

익명 사용자의 이미지

사용하지 않는다고 표시만 하는거죠.
그 사이에 데이터가 덮어써지지 않았으면 잘 동작하는겁니다.
그래도 조심하세요...

jeun3786의 이미지

깜빡잊고 있었네요 ㅎㅎㅎ

barmi의 이미지

다른 분들의 지적처럼, 분명 잘못된 코드가 맞으며, 경우에 따라서는 제대로 동작하기도 합니다.

문제가 되는 부분은 예상대로, 다음 코드의 관계입니다.
free(plist);
plist = plist->next;

우연찮게도 free(plist); 후에 context-switch 가 발생해서 다른 코드 수행 후에, 다음 문장을 수행하면 문제가 됩니다.
즉, thread-safe 하지 않는 코드입니다.
(jick님 말씀처럼 평소에 잘 동작하다가 사흘에 한번씩 뻗는 코드가 되는 겁니다.)

그리고, 한가지 더,
plist == NULL인 사항은 오류 조건이 아닌 정상적인 조건이라는 것입니다.
즉, empty list인 것이지요.
이런 경우에는 내부적인 처리만 하고, 정상적인 리턴값으로 처리하는 것이 바람직할 것으로 보입니다.
물론 경우에 따라서 empty list를 허용하지 않는다면, 오류 조건이 맞을 것 같고요.

참고하시기 바랍니다.

jeun3786의 이미지

리스트 신경써야 될게 많네요 ㅠㅠ

M.W.Park의 이미지

free(p) 하고 나서는 p=NULL 같은 코드를 넣어서 포인터 재참조하면 확실히 오류가 나게 만드는 습관을 가지시는 것이 좋습니다.

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

jeun3786의 이미지

좋은것 배우네요~~ 감사합니다!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.