CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ 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!
[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.