2015년 4월 20일 월요일

[C/C++] 지역배열과 전역배열

  변수가 전역변수, 정적변수, 지역변수로 나뉘듯이 배열도 전역배열, 정적배열, 지역배열로 구분할 수 있다. 한 가지 주의할 차이점은 전역배열과 정적배열은 자동으로 초기화가 되고 지역배열은 컴파일러에 따라서 그렇지 않을 수도 있다는 점이다. 즉, 초기화되지 않은 전역/정적배열은 자동으로 0으로 초기화 되지만 지역배열은 초기화되지 않으면 쓰레기값으로 채워진다고 봐야한다.

  다음 예제를 보면 초기화하지 않은 전역배열의 모든 요소의 합은 0이지만, 초기화하지 않은 지역배열의 모든 요소의 합은 엉뚱한 값이 나옴을 확인할 수 있다. 단 첫 요소만이라도 초기화가 된 경우는 나머지 요소들은 자동으로 0으로 채워진다는 것은 전 절에서 설명한 바가 있다.



#include <stdio.h>
typedef unsigned char uchar;
uchar ucaExt[10];  //전역배열
int main(void) {
    uchar uca1[10];  //지역 배열
    uchar uca2[10] = {1}; // 지역배열. 나머지는 0으로 채워진다.
    short sSum1 = 0, sSum2 = 0, sSum3=0;

    for (short sN=0; sN<10; sN++) {
        sSum1 += ucaExt[sN];
        sSum2 += uca1[sN];
        sSum3 += uca2[sN];
    }

    printf("sSum1:%d, sSum2:%d, sSum3:%d\n", sSum1, sSum2, sSum3);
}

한 가지 예를 더 들어 보겠다. 다음처럼 전역배열이 두 가지 있다고 할 때 두 문장의 차이점은 어떻게 될지 생각해 보라.

───────────────────────────────────
int iaExt1[] = {1, 2, 3, 4};
int iaExt2[5] = {1, 2, 3};
───────────────────────────────────

전 절에서 [..]안에 배열의 크기를 생략하면 뒤의 초기화 값의 개수에 따라 배열의 크기가 결정된다고 설명한 바 있다. 따라서 iaExt1의 배열의 크기는 4가 되지만 iaExt2의 크기는 5라고 못 박았기 때문에 초기값이 지정되지 않은 4번째와 5번째 요소는 0으로 초기화된다.

댓글 없음:

댓글 쓰기