[ CnUnix ] in KIDS 글 쓴 이(By): ymir (Mizz) 날 짜 (Date): 2010년 02월 13일 (토) 오전 10시 53분 10초 제 목(Title): Re: C 언어 몰라던 사실 하나 더.. 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! |