Dev/C, C++

[ C ] 포인터 변수가 가리키는 문자열 또는 배열의 길이 구하기

surimi🍥 2021. 12. 26. 17:28
반응형

일반적인 배열이나 문자열의 길이를 구하는 방법은 다음과 같다.

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() 함수를 쓰면 되긴 하다.🤷‍♂️

반응형