2005년 5월 31일 화요일

C언어 문자열 대입(String assign)

char* str;
str = (char*)malloc(2 * sizeof(char));

1. str = "S"
2. str[0] = 'S';
    str[1] = '\0';
3. strcpy(str, "S");
4. strdup(str, "S");

1번은 "S"라는 literal이 가리키는 주소(statically allocated constant)를 str에 집어넣어버린다.
http://groups.google.co.kr/group/comp.lang.c/browse_thread/thread/66a16943b9cacc4/c7f6147134e6428f?q=c+string+assign&rnum=1&hl=ko#c7f6147134e6428f
따라서 위에서 이미 할당해 준 메모리에 대해 Memory leak이 발생한다.

2번은 새로운 주소를 넣지 않고 이미 할당받은 곳에 "S"라는 문자열을 집어넣는 것이다.

3번은 2번과 같은 결과를 가져온다.

4번은 새 메모리를 할당하고 "S"를 넣는 다. 1번처럼 memory leak이 발생한다.


char *str = "A";
str[0] = 'B';
str[1] = '\0';

segmentation fault를 낸다.
str이 가리키는 "A"가 들어있는 공간은 statically allocated constant가 들어있으므로 값을 변경할 수가 없다.

참고) statically allocated constant를 가리키고 있을 때 free를 부르면 behavior를 예상할 수 없다.
        (segmentation fault가 나기도 한다.)


string에 새로운 내용을 넣을 때는 function call시 pointer를 쓰고
string의 새로운 공간을 할당하기 위해서는 pointer of pointer를 쓴다.
http://groups.google.co.kr/group/comp.lang.c/browse_thread/thread/9c6dcd4f43190b20/6cdac8fc4afca9e1?q=c+string+assign&rnum=2&hl=ko#6cdac8fc4afca9e1

댓글 없음:

댓글 쓰기