|
size 결과가 4가 나오는 것은 포인터의 크기가 4 byte 이기 때문입니다.
'string' 변수의 타입은 'unsigned char *' 으로 하나의 포인터 입니다. 32bit 컴퓨터에서는 포인터 자체는 항상 4 bytes이니까, 일단, sizeof(string)은 4입니다.
그리고, string[0]의 타입은 unsigned char 형이므로 1byte입니다. 따라서 'sizeof(string)/sizeof(string[0])' 의 결과는 4가 될 수 밖에 없습니다.
12라는 값은 '포인터가 가리키는 대상의 개수'를 뜻하는 것인데, 이 값을 얻으려면 문자열 처음부터 NULL 종료 문자를 만날 때까지 개수를 헤아리면 됩니다. strlen() 같은 함수를 써도 될 것 같습니다. (최근의 String 같은 문자열 타입들은 문자의 개수를 따로 저장하는 것으로 압니다. 쓰기에 더 편하겠죠.)
어쨌든 결론은, 원하는 것은 '문자열 포인터가 가리키고 있는 대상의 개수'를 알고 싶은 것이지 '문자열 포인터 자체의 크기'를 알려고 하는 것은 아니라는 겁니다. 그러니까 타입의 크기를 알려고 하는데 쓰는 'sizeof' 연산자를 쓰는 것이 아니라, 문자열의 개수를 반환하는 'strlen' 같은 함수를 쓰는 것이 맞다고 봅니다.
김민조 님이 쓰신 글 :
: #include<stdio.h>
: #include<string.h>
:
: unsigned char str[]={"aaasdfsadfa"};
:
: void _printf(unsigned char *string)
: {
: unsigned char size = sizeof(string)/sizeof(string[0]);
: unsigned char Size = sizeof(str)/sizeof(str[0]);
:
: printf("%s\n",string);
:
: printf("%d\n",size);
: printf("%d\n",Size);
: }
:
:
:
: int main()
: {
: _printf(str);
: return 0;
:
: }
:
: 이걸 실행하면
: aaasdfsadfa
: 4
: 12
: 가 나오는데요
: size변수에 12가 되게 할 수 있는 방법은 없나요? 꼭 배열이름으로 sizeof연산을 해줘야만 값이 나오나요?
|