안녕하세요. 궁금증연구소입니다.
오늘 포스팅 주제는 "[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;
}
[c++] string.begin()의 포인터와 string name의 포인터는 다르다. (1) | 2022.09.23 |
---|---|
[c++] Default argument value redeue redeclared for parameter 에러 (1) | 2022.09.21 |
[C언어]Suspicious pointer conversion 에러 (0) | 2022.09.10 |
C언어 sizeof(자료형) 간단정리 (0) | 2022.08.10 |
c언어 버퍼비우기 (%*c) (0) | 2022.08.06 |