C free() 함수 질문입니다!!!

abcdefgefghxxx의 이미지

열흘뒤 씨개발자로 전향하게 되는 초보 씨 개발자 입니다.
연습삼아 코딩을 해보고 있는데 막히는 부분이 있어서 질문 드립니다. 소스는..
-----------------------------------
#include
#include
#include
#include
struct Linked_list
{
char* data;
Linked_list* next;
};
Linked_list* nxtNode()
{
Linked_list * nxtNode = (Linked_list *)malloc(sizeof(Linked_list));
nxtNode->data =(char *)malloc(sizeof(char)*5);
return nxtNode;
}
int main()
{
Linked_list* a = (Linked_list *)malloc(sizeof(Linked_list));
a->data = (char *)malloc(sizeof(char)*5);

strcpy(a->data,"korea");
printf("%s",a->data);
a->next = nxtNode();

strcpy(a->next->data, "sorry");
printf("%s",a->next->data);

free(a->next);
free(a);

return 0;

}
----------------------------------
개발환경은 비쥬얼스튜디오 2010/윈도우7 32bit
----------------------------------

위의 소스로 하면 정상 동작 됩니다만..

메모리 해제 할때
free(a->next->data);
free(a->next);
free(a->data);
free(a);
이게 맞는걸로 알고 있었는데에러가 나네요..

원인이 무엇인지 고수님들께 여쭙사옵니다~ ^_^;;;

익명 사용자의 이미지

free(p);
p=NULL;

abcdefgefghxxx의 이미지

자꾸 에러나서 NULL처리 지웠다 붙였다 하다가 소스 붙일땐 지운상태로 붙였네요..

답글 감사합니다 ^^

God bless you^^

jick의 이미지

"korea", "sorry"는 다섯 글자짜리 문자열이므로 마지막 널문자까지 포함하면 6바이트를 할당해야 하는데 5바이트만 할당하셨네요.

abcdefgefghxxx의 이미지

아 초보적인 실수를 했네요..

그런데..

10바이트 할당하고
strcpy(a->data,"korea"); 대신
a->data = "korea"; 로 해주면 에러나는 이유는 뭐일까요?@.@
6바이트 할당해도 아래 코드로 돌리면 에러나네요..ㄷㄷㄷ;

God bless you^^

jick의 이미지

C 포인터 기초를 다시 차근차근 보셔야 할 것 같습니다.

a->data = "korea"; 이렇게 쓰면 a->data 자체가 프로그램의 상수 영역에 적혀 있는 (변경 불가능한) "korea"라는 문자열을 가리키게 되고 기존에 malloc한 영역은 (이제 그 영역을 가리키는 변수가 하나도 없으므로) 더 이상 접근할 수 없는 memory leak이 됩니다. 그리고 나중에 free를 하면 아까 malloc한 주소가 아닌 상수 문자열 "korea"의 주소를 free하려고 하니 에러가 나죠.

abcdefgefghxxx의 이미지

감사합니다~ !!!! ^^

God bless you^^

abcdefgefghxxx의 이미지

매번 질문 감사합니다 ^^!!

그렇다면 strcpy 등 함수를 이용하지 않고는 힙 영역에 못넣는건가요??

God bless you^^

klara의 이미지

하나씩 대입하면 되지요.
C의 문자열은 문자의 배열이라는 것을 명심하세요.
일반 배열과 다루는 방법은 완전히 똑같습니다.
문자열 함수들은, 문자열을 조작하는 일이 자주 쓰이는 만큼, 편리하게 (최적화되있는 경우도있는) 함수로 그것들을 만들어둔것 뿐입니다.

abcdefgefghxxx의 이미지

덕분에 머릿속에서 딱 정리가 되었네요~

행복하세요!!!! ^^

God bless you^^

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.