[C/C++] Array 배열을 함수의 매개변수로 사용 시 주의점

    반응형

    Main함수로부터 scores[5] 배열을 넘겨받아 배열의 원소를 출력하는 PrintScore 함수를 살펴보자.

    void PrintScore(int scores[5], int size)
    {
      cout << "* PrintScore Array" << endl;
      for (int i = 0 ; i < size ; i++) {
        cout << "scores[" << i << "] - " << scores[i] << endl;
      }
    }
    
    int main(void)
    {
      int scores[5] = {0,1,2,3,4};
      int size = sizeof(scores) / sizeof(int);
      cout << "* Main Array" << endl;
      for (int i = 0 ; i < size ; i++) {
        cout << "scores[" << i << "] - " << scores[i] << endl;
      }
      PrintScore(scores, size);
      return 0;
    }

     

    코드를 실행시켜보면 다음과 같이 정상적으로 출력된다.

    * Main Array
    scores[0] - 0
    scores[1] - 1
    scores[2] - 2
    scores[3] - 3
    scores[4] - 4
    * PrintScore Array
    scores[0] - 0
    scores[1] - 1
    scores[2] - 2
    scores[3] - 3
    scores[4] - 4

     

    다음으로 PrintScore 함수에서 scores 배열의 0번째 인덱스 값을 1로 초기화 해 보았다.

    void PrintScore(int scores[5], int size)
    {
      cout << "* PrintScore Array" << endl;
      scores[0] = 1;
      for (int i = 0 ; i < size ; i++) {
        cout << "scores[" << i << "] - " << scores[i] << endl;
      }
    }
    
    int main(void)
    {
      int scores[5] = {0,1,2,3,4};
      int size = sizeof(scores) / sizeof(int);
      PrintScore(scores, size);
      cout << "* Main Array" << endl;
      for (int i = 0 ; i < size ; i++) {
        cout << "scores[" << i << "] - " << scores[i] << endl;
      }
      return 0;
    }

     

    코드를 실행시켜보면 놀랍게도 Main Array 값의 0번째 인덱스도 1로 초기화 되었음을 확인할 수 있다. 그렇다면 왜 이러한 상황이 발생하는 것일까?

    * PrintScore Array
    scores[0] - 1
    scores[1] - 1
    scores[2] - 2
    scores[3] - 3
    scores[4] - 4
    * Main Array
    scores[0] - 1
    scores[1] - 1
    scores[2] - 2
    scores[3] - 3
    scores[4] - 4

     

    그 이유는 PrintScore의 매개변수 scores는 배열의 값이 아닌 scores 배열을 가리키는 "포인터" 이기 때문이다. 따라서 PrintScore 함수의 scores 포인터 변수가 직접 scores 배열 주소에 접근해 값을 변경해 버린 것이다.

     

    단지 PrintScore 함수가 배열을 받는다는 의미를 확실하게 하기 위해 int scores[5]과 같은 형식으로도 매개변수를 받을 수 있도록 코딩할 수 있는 것이다.

    따라서, 매개변수 scores[5] 배열 괄호 안의 숫자 5는 적지 않아도 코드는 정상적으로 돌아간다. (괄호 안의 숫자는 컴파일러가 자동으로 무시한다.)

    void PrintScore(int scores[5], int size); // same
    void PrintScore(int scores[], int size); // same

     

    마지막으로 PrintScore함수의 배열의 크기와 주소값과, main함수의 배열의 크기와 주소값을 출력해 보았다.

    void PrintScore(int scores[], int size)
    {
      cout << "PrintScore " << "adress " << &scores << "size " << sizeof(scores) << endl;
    }
    
    int main(void)
    {
      int scores[5] = {0,1,2,3,4};
      int size = sizeof(scores) / sizeof(int);
      PrintScore(scores, size);
      cout << "Main " << "adress " << &scores << "size " << sizeof(scores) << endl;
      return 0;
    }

     

    PrintScore 함수의 파라미터 배열 scores는 포인터 변수이기에, 포인터 변수의 크기 8byte (컴파일러에 따라 다를 수 있음) 가 출력되고, main 함수의 scores 배열의 크기는 4byte(int) * 5 = 20byte가 출력된다.

    PrintScore adress 0x7ffc330acc68size 8
    Main adress 0x7ffc330acc90size 20
    반응형

    댓글

    Designed by JB FACTORY