[질문] free() 함수
글쓴이: deux9745 / 작성시간: 목, 2015/08/13 - 3:32오후
아래 마지막 free 에서 에러가 나는데, 왜 발생하는지 설명 부탁드립니다.
dup 함수에서 malloc 한 후 point 를 return 하면 함수를 빠져나와도 malloc 된 것은 그대로 남아 있어야 하지 않나요?
heap 영역이라, dup 함수가 리턴되면 자동 release 되나요 ?,
#include <stdio.h> char *dup(char msg[]) { char *buf = malloc(sizeof(msg)); strcpy(buf, msg); return buf; } int main() { char msg[] = "hello world"; char *buf = realloc(NULL, sizeof(msg)); char *p; strcpy(buf, msg); printf("%s\n", buf); free(buf); p = dup(msg); printf("%s\n", p); free(p); } 예를 들어 linked list 의 경우는 아래처럼 lptr에 point 로 넘겨서 함수 안에서 malloc 해 메모리 할당 후 함수를 빠져 나가도 생성한 메모리는 lptr 에 계속 유지 되는데요 좀 헷갈립니다. void insert(list* lptr,int value,int position){ //insert value to proper position if(position<1 || position>(lptr->count)+1){ printf("Position Out of Bound\n"); return; } nptr new_nptr=(node*)malloc(sizeof(node)); new_nptr->value=value; if(position==1){ new_nptr->next=lptr->head; lptr->head=new_nptr; } else{ nptr tmp=lptr->head; int i; for(i=1;i<position-1;i++){ tmp=tmp->next; } new_nptr->next=tmp->next; tmp->next=new_nptr; } lptr->count++; }
Forums:
무슨 에러가 나지요? 자세한 실행결과 첨부
무슨 에러가 나지요? 자세한 실행결과 첨부 부탁드립니다.
---------------------------------
제일 왼쪽이 저입니다 :)
전 에러가 나지 않습니다. 그러나 소스를 보았을때
전 에러가 나지 않습니다.
그러나 소스를 보았을때 의심되는 것은
in main
char *buf = realloc(NULL, sizeof(msg));
in dub
char *buf = malloc(sizeof(msg));
이것으로 인한 메모리 버퍼 오버 플로우를 일으키고 이로 인한 마지막 콜스택이 꼬여 세크폴트가 났을것으로 예상됩니다.
아래와 같이 변경해야 할것 같습니다.
=> char *buf = realloc(NULL, strlen(msg)+1);
=> char *buf = malloc(strlen(msg) + 1);
에러가 발생하는데, 안난다는게 이상하네요 회사에서
에러가 발생하는데, 안난다는게 이상하네요
회사에서 파일 첨부가 안되어서 대략 적어서 보내드립니다.
도스 창에는 아래 두개 출력 후
hello world
hello world
마지막
free(p);될 시점에 아래와 같이 창이 뜹니다.
Microsoft visual C++ debug Livaray
Program : D:\a.exe
Damage : after Normal block (#52) at 0x001c1730
(Press Retry to debug the application)
제 환경은 이랬습니다. gcc version
제 환경은 이랬습니다.
gcc version 5.2.0 (GCC)
4.1.4-1-ARCH x86_64
쉬운 문제네요.
쉬운 문제네요.
char*buf = malloc(strlen(msg)+1);
로 고쳐 쓰세요.
참고로, strdup 함수도 있습니다..
.. 아까 못봤던 정답이 위에 있네요.. 지우지도 못하고 남겨둡니다ㅠㅠ
댓글 달기