sanova 님의 설명이 맞습니다.
char *str1 = "abcdef";
char str2[] = "ABCDEF";
위의 "abcdef" 이나 "ABCDEF" 과 같은 string literal 은..
.rodata section (read-only data segment) 에 생성됩니다.
str1 은 char * 의 변수에 "abcdef" 의 주소를 assign 한 것이기 때문에..
str1 을 통해 접근은 가능하나, 내용을 수정할 수 없고..
str2 는 "ABCDEF" 에 있는 데이터 크기만큼 stack 에 array 를 생성하고..
"ABCDEF" 의 내용을 복사한 것이라.. 수정 가능합니다.
str1 같은 경우는..
const char *str1 = "abcdef"; 과 같이 선언해 주는게 좋습니다.
$ cat str.c
#include <stdio.h>
int main(void)
{
char *str1 = "abcdef";
char str2[] = "ABCDEF";
return 0;
}
$ gcc str.c
$ objdump -s -j .rodata a.out
a.out: file format elf32-i386
Contents of section .rodata:
804846c 03000000 01000200 61626364 65660041 ........abcdef.A
804847c 42434445 4600 BCDEF.
근데 Windows 에서는 어떤지 모르겠네요..
const char *typestr(int type)
{
if (type == 1)
return "type_1";
else
return "type_2";
}
위와 같은 코드는, 저 string literal 이 stack 에 잡히기 때문에..
Windows 에서는 쓰면 안 된다고 욕먹은 기억이.. ;;
Oh, I do believe everlasting love and destiny to meet you again
I feel a pain I can hardly stand all I can do is loving you
- *Mizz* the Magic Knight!