궁금증 연구소

안녕하세요. 궁금증연구소입니다.

오늘 포스팅 주제는 "[c++] 배열의 sizeof 연산자 구할 때 주의할 점(매개변수 sizeof와 차이)"입니다.

 

#include <iostream>
#include <string>

using namespace std;

main()
{
    string arr[] = {"kim", "lee","choi"};

    cout << "sizeof(arr) :" << sizeof(arr) << endl;
    cout << "sizeof(string) :" << sizeof (string) << endl;
    cout << sizeof(arr) / sizeof(string);

}

보통 배열의 개수를 구할 때 sizeof 연산자를 많이 활용한다.

 

위와 같이 sizeof(arr)를 구하면 string 객체의 개수만큼 사이즈가 구해지기 때문에, 아래와 같은 결과를 볼 수 있다.

 

결과

따라서 두 값을 나눈 값은 3으로 string arr [] 배열의 크기를 구할 수 있다.

 

그런데,

 

#include <iostream>
#include <string>

using namespace std;

void test(const string arr[]);

main()
{
    string arr[] = {"kim", "lee","choi"};

    cout << "sizeof(arr) :" << sizeof(arr) << endl;
    cout << "sizeof(string) :" << sizeof (string) << endl;
    cout << sizeof(arr) / sizeof(string);

    test(arr);

}

void test(const string arr[]){
    cout << "test함수 매개변수 arr크기: " <<sizeof(arr)<<endl;
    cout << "test함수 매개변수 string 크기:" <<sizeof(string)<<endl;
}

만약 위와 같이 test 함수에 string arr 값을 매개변수로 받은 함수에서, 매개변수로 받은 배열의 개수를 알고 싶다면 어떻게

해야 할까?

 

test 함수 내에서 배열의 개수를 똑같이 구해보자.

 

포인터의 크기

당연하다. 매개변수의 string arr []는 string arr 배열의 시작 위치 즉, 포인터이기 때문이다. 따라서 포인터 값의 sizeof를 하면 4바이트가 출력된다. 따라서 sizeof(arr)/ sizeof(string) 이런 식으로 매개변수로 받은 배열을 통해 개수를 구하려고 하면

Error가 발생한다.

 

해결법은 몇 가지가 있는데, 가장 쉬운 방법은, main함수에서 배열의 개수를 매개변수로 같이 넘겨주는 것이다.

 

배열크기 넘겨주기

 

 

두 번째 방법은 매크로를 활용하는 것이다. (출처: https://www.geeksforgeeks.org/)

 

// C Program to demonstrate usage of macros to find the size
// of arrays
#include <stdio.h>
 
#define SIZEOF(arr) sizeof(arr) / sizeof(*arr)
 
void fun(int arr[], size_t arr_size)
{
    int i;
    for (i = 0; i < arr_size; i++) {
        arr[i] = i;
    }
}
 
// Driver Code
int main()
{
    int i;
    int arr[] = { 0, 0, 0, 0, 0 };
    size_t n = SIZEOF(arr);
    fun(arr, n);
 
    printf("The size of the array is: %ld", n);
    printf("\nThe elements are:\n");
    for (i = 0; i < n; i++)
        printf(" %d ", arr[i]);
 
    return 0;
}

 

마지막으로, (출처: https://www.geeksforgeeks.org/)

아래와 같이 포인터 연산으로 구하는 방법도 존재한다.

// C Program to demonstrate usage of pointer arithmetic to
// find the size of arrays
#include <stdio.h>
 
void fun(int arr[], size_t arr_size)
{
    int i;
    for (i = 0; i < arr_size; i++) {
        arr[i] = i;
    }
}
 
// Driver Code
int main()
{
    int i;
    int arr[] = { 0, 0, 0, 0, 0 };
    size_t n = (&arr)[1] - arr;
    fun(arr, n);
 
    printf("The size of the array is: %ld", n);
    printf("\nThe elements are:\n");
    for (i = 0; i < n; i++)
        printf(" %d ", arr[i]);
 
    return 0;
}
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading