프로그래밍/C,C++

[C/C++] 매개변수로 배열을 받을때는 사이즈도 함께 받자.

gameObject 2023. 6. 11. 22:19
728x90

함수에서 배열을 가져다 쓰고싶을 수 있다.

이때는 배열의 크기도 함께 매개변수에 추가하여 보내주어야 한다.

함수 내에서 정수형태로 입력을 그냥 해줘도 상관은 없지만, 유지보수할때 놓칠 가능성이 높다.(내생각)

 

배열을 포인터를 통해 받게되면 포인터는 배열의 가장 앞쪽 [0]번째 인덱스 주소만을 가르키고 있기 때문에

배열 전체의 사이즈를 알 수 없다.

 

따라서 배열 크기를 넘어서는 값을 참조하게 될경우, 다른 메모리를 덮어 써버릴 수 있다.

(예전에는 이런문제들 때문에 블루스크린등 문제가 많이 발생했었다고 한다.)

 

 

#include <iostream>
using namespace std;

void ArrayFunc(int* ptrArray);
void ArrayFunc2(int* ptrArray, int arraySize);


int main()
{
    int numbers[10] = {0,};
    for(int i = 0; i < 10; i++)
    {
        numbers[i] = (i+1)*10;
    }

    for(int i = 0; i<10; i++)
    {
        printf("%d ",numbers[i]);
    }
    printf("\n");

    int *ptrNumber = &numbers[2];

    printf("3번째 자리에 있는 값 + 1 -> %d \n", *(ptrNumber+1)); //40
    printf("3번째 자리에 있는 값 + 1 -> %d \n", *ptrNumber+1); // 31

    //{numbers와 numbers[0]의 주소는 같다.
    printf("numbers 가 들고 있는 값 -> %p \n", numbers); 
    printf("numbers[0]의 주소 값 -> %p \n", &numbers[0]);
    //numbers와 numbers[0]의 주소는 같다.}

    ArrayFunc(numbers);
    ArrayFunc2(numbers, 10);
}

void ArrayFunc(int* ptrArray)
{   
    //배열을 역참조(포인터)로 받게되면 배열의 크기를 체크할 수 없다.
    //다른 메모리를 덮어써버릴 수도있다.(배열의 크기를 넘어서는 값을 참조하게 되면)
    //10
    printf("ptrArray 역참조 값 : %d \n", *(ptrArray));
    //100
    printf("ptrArray + 1 주소의 역참조 값 : %d \n", *(ptrArray+9));
    //357498393 (배열크기 10을 초과한 값, 어떤값이 있을지 알 수 없다.)
    printf("ptrArray + 1 주소의 역참조 값 : %d \n", *(ptrArray+10));
    //사이즈가 3이나 초과하여 역시나 어떤값이 있을지 알 수 없다.
    printf("ptrArray + 1 주소의 역참조 값 : %d \n", *(ptrArray+12));

}
// 배열은 사이즈를 넘겨서 처리해줘야함.
void ArrayFunc2(int* ptrArray, int arraySize)
{   
    for(int i = 0; i<arraySize; i++)
    {
        printf("ptrArray 역참조 값 : %d \n", *(ptrArray+i));
    }   
}
728x90