char buf[20];
buf = "abcd";
printf("%s\n", buf);
>위 소스를 컴파일 하고 실행하면 이상한 값들을 볼 수 있다.
char * buf;
buf = malloc(20)
*buf = "abcd";
printf("%s\n", buf);
>위 소스를 컴파일 하고 실행하면 이상한 값들을 볼 수 있다.
char buf[20];
buf[0] = 'a';
buf[1] = 'b';
buf[2] = 'c';
buf[3] = 'd';
printf("%s\n", buf);
>abcd
char * buf;
buf = malloc(20)
*buf = 'a';
*(buf+1) = 'b';
*(buf+2) = 'c';
*(buf+3) = 'd';
printf("%s\n", buf);
>abcd
문자는 되는데 문자열은 안된다.
char buf[20];
buf[0] = 'a';
buf[1] = 'b';
buf[2] = 'c';
buf[3] = 'd';
printf("%s\n", buf);
buf = "abcd";
printf("%s\n", buf);
>abcd
>*bcd
위에서 *은 출력했을때 바뀌기도 하고 바뀌지 않기도 하는 부분이다.
바뀌기도 하고 바뀌지 않기도 한다는 것은. 문자열이 숫자로 바뀌어서 들어갔다는 것은
아니라는 말이고 문자열중 1byte만 들어갔다는 말도 아니다.
그럼 나머지 변수는 프로그램 실행시마다 변경될 수 있는 할당영역 즉, 주소이다.
int a;
a = "test";
printf("0x%x\n", a);
>0x80484c0
0x80~ 주소가 나오게 된다.
그러면! 문자열이 주소를 리턴하고 있다는 말이 되는데!!!
printf("0x%x\n", &("test"));
>0x80484c0
동일한 주소가 나오거나 0x80~ 주소가 나오게 된다.
그렇다! 위에서 * 부분이 바뀌기도 하고 바뀌지 않기도 하던 이유가 바로 이 때문이다.
그렇다면 이것을 가지고 재밌는 놀이를 할 수 있음을 알 수 있다.
1. 포인터변수는 주소를 값으로 가지고 '*' operand 를 통해 주소의 값을 제어할 수 있다.
2. 문자열은 주소를 가지고 int 형 변수는 주소를 담을수 있는 충분한 공간을 제공 한다.
3. 재밌는 놀이를 할 수 있다.
int a;
a = "test";
printf("%s\n", (char *)a);
>test
이렇게도 가능하다.
int * pt;
pt = malloc(sizeof(int));
*pt = "test";
printf("%s\n", (char *)(*pt));
free(pt);
>test