C언어 큰 따옴표 문자열 메모리 관련
글쓴이: 유현규 / 작성시간: 일, 2005/11/06 - 7:54오후
#include <stdio.h> void hello(char** ppstr); int main() { char* pstr; hello(&pstr); printf("%p %s\n", pstr, pstr); return 0; } void hello(char** ppstr) { *ppstr = "hello"; printf("%p %s\n", *ppstr, *ppstr); }
여태 별로 신경 안 쓰고 있었는데 갑자기 궁금해지는군요.
큰 따옴표로 문자열 메모리 할당해서 포인터를 넘겨 받으면
배열로 잡지 않은 이상 힙에 저장될텐데 해제는 언제 되는 거죠?
저 실행 결과는 당연하게도 해제가 되었는지 안 되었는지 알 수 없었습니다.
printf, scanf, fopen 각종 함수에도 인자로 넣는데 말이죠.
Forums:
초기화시에 큰따옴표로 선언된 스트링은heap이 아니라 code 영
초기화시에 큰따옴표로 선언된 스트링은
heap이 아니라 code 영역에 잡힌다고 들었습니다만...?
저렇게 선언된 문자열이 const (읽기전용)으로 잡히는 게
그래서 그런거 아닌가요? ... 아닌가? ('' )a e( '')
아마... 저 문자열 잡힌 주소가 hello 함수의 주소 근처일걸요? ^^
----------------------------------------------
한번뿐인 인생....
미친듯이 살아보자!
----------------------------------------------
[code:1]#include <stdio.h>void
[root@fedora test]# ./a.out
address of hello : 0x8048558
address of func hello : 0x8048472
address of local mem : 0xfef30e50
address of danymic mem : 0x8294008
세그멘테이션 오류
[root@fedora test]#
보시면 pstr 의 주소에 쓰기를 시도하는 순간 세그폴트가 뜨는걸 알수 있슴다.
코드영역에 잡히니 컴파일 시점에서 이미 주소가 정해질 뿐더러...
해제같은것도 되지 않습니다.
----------------------------------------------
한번뿐인 인생....
미친듯이 살아보자!
----------------------------------------------
큰 따옴표로 둘러싸인 문자열을 문자열 상수라 부르며, 수정 불가능한 ch
큰 따옴표로 둘러싸인 문자열을 문자열 상수라 부르며, 수정 불가능한 char형 배열로 취급됩니다.
문자열 상수의 할당과 해제는 컴파일러가 알아서 할 일이지만, 대체로 프로그램이 실행되는 동안 항상 존재한다고 보시면 됩니다.
댓글 달기