C free() 함수 질문입니다!!!
열흘뒤 씨개발자로 전향하게 되는 초보 씨 개발자 입니다.
연습삼아 코딩을 해보고 있는데 막히는 부분이 있어서 질문 드립니다. 소스는..
-----------------------------------
#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;
free(p);
p=NULL;
답글 감사합니다!
자꾸 에러나서 NULL처리 지웠다 붙였다 하다가 소스 붙일땐 지운상태로 붙였네요..
답글 감사합니다 ^^
God bless you^^
...
"korea", "sorry"는 다섯 글자짜리 문자열이므로 마지막 널문자까지 포함하면 6바이트를 할당해야 하는데 5바이트만 할당하셨네요.
답글 감사합니다 ^^
아 초보적인 실수를 했네요..
그런데..
10바이트 할당하고
strcpy(a->data,"korea"); 대신
a->data = "korea"; 로 해주면 에러나는 이유는 뭐일까요?@.@
6바이트 할당해도 아래 코드로 돌리면 에러나네요..ㄷㄷㄷ;
God bless you^^
당연히 에러나죠...;;;
C 포인터 기초를 다시 차근차근 보셔야 할 것 같습니다.
a->data = "korea";
이렇게 쓰면 a->data 자체가 프로그램의 상수 영역에 적혀 있는 (변경 불가능한) "korea"라는 문자열을 가리키게 되고 기존에 malloc한 영역은 (이제 그 영역을 가리키는 변수가 하나도 없으므로) 더 이상 접근할 수 없는 memory leak이 됩니다. 그리고 나중에 free를 하면 아까 malloc한 주소가 아닌 상수 문자열 "korea"의 주소를 free하려고 하니 에러가 나죠.아하~~
감사합니다~ !!!! ^^
God bless you^^
아 마지막으로..
매번 질문 감사합니다 ^^!!
그렇다면 strcpy 등 함수를 이용하지 않고는 힙 영역에 못넣는건가요??
God bless you^^
하나씩 대입하면 되지요. C의 문자열은 문자의
하나씩 대입하면 되지요.
C의 문자열은 문자의 배열이라는 것을 명심하세요.
일반 배열과 다루는 방법은 완전히 똑같습니다.
문자열 함수들은, 문자열을 조작하는 일이 자주 쓰이는 만큼, 편리하게 (최적화되있는 경우도있는) 함수로 그것들을 만들어둔것 뿐입니다.
감사합니다 ^^
덕분에 머릿속에서 딱 정리가 되었네요~
행복하세요!!!! ^^
God bless you^^
댓글 달기