반응형
일반적인 배열이나 문자열의 길이를 구하는 방법은 다음과 같다.
int main(int ac, char const *av[])
{
char arr[] = "12345";
printf("arr size : %d\n", sizeof(arr) / sizeof(char));
// 출력결과
// arr size : 6
}
하지만 포인터 변수로 생성한 배열이나 문자열의 크기는 sizeof() 로는 구할 수 없는데,
int main(int ac, char const *av[])
{
char *a = "123456789";
printf("a : %s\n", a);
printf("a size : %d\n", sizeof(a) / sizeof(char));
// 출력 결과
// a : 123456789
// a size : 4
}
a는 포인터 변수이기 때문에 32bit 환경에서는 4byte, 64bit 환경에서는 8byte 만을 가지기 때문.
( 여기서 32, 64bit는 운영체제가 아닌 MinGW32, 64 설정에 따름 )
포인터 변수에 담긴 값의 길이는 다음과 같이 구할 수 있다.
int main(int ac, char const *av[])
{
char *a = "123456789";
size_t i = 1; // 문자열 끝의 "\0"은 세지지 않으므로 미리 더해둔다.
for (; *a; a++, i++)
;
a -= i;
printf("size : %d\n", i);
printf("a: %s\n", a);
// 출력 결과
// size : 9
// a: 123456789
}
for문에서, 포인터 변수 a의 주소가 가리키는 값이 NULL이 나올 때까지 1씩 a의 주소값을 증가시키며,
문자열의 크기를 담을 변수 i도 함께 증가시킨다.
for문이 종료되면 i는 *a가 가리키는 문자열의 사이즈가 되고, a의 주소값은 초기값으로 되돌린다.
배열을 함수의 인자로 넘기는 경우, 배열이 아닌 포인터 주소가 전달되므로 크기를 구할 때 sizeof()가 아닌 위와 같은 방식으로 구해야 한다.
void f(char abc[])
{
printf("abc : %s\n", abc);
printf("abc size : %d\n", sizeof(*abc) / sizeof(char));
// abc : 12345
// abc size : 4 포인터 변수의 크기가 출력됨.
size_t i = 1;
for (; *abc; abc++, i++)
;
abc -= i;
printf("size : %d\n", i);
printf("abc: %s\n", abc);
// size : 6
// abc: 12345
}
int main(int ac, char const *av[])
{
char arr[] = "12345";
printf("arr size : %d\n", sizeof(arr) / sizeof(char));
// arr size : 6
f(arr);
}
사실 문자열은 <string.h> 헤더에 있는 strlen() 함수를 쓰면 되긴 하다.🤷♂️
반응형
'Dev > C, C++' 카테고리의 다른 글
[VSCode / C / C++] VSCode에서 Makefile 사용하기 (0) | 2021.12.17 |
---|---|
[ C, C++ ] malloc 캐스팅 왜 안 해도 되는지 관련 글 링크 (0) | 2021.10.18 |
[ C ] char 포인터가 malloc으로 할당된 메모리보다 더 많은 데이터를 저장하는 이유 (1) | 2021.10.18 |