9-2.배열 초기화

9-2-가.쓰레기값

배열은 여러 변수의 집합이라는 점이 조금 특수할 뿐이지 정수형 변수나 실수형 변수와 자격은 동일한 변수이다. 그래서 변수에 적용되는 모든 규칙이 배열에 대해서도 똑같이 적용된다. 배열 선언에 사용되는 기억 부류 지정자도 일반 변수와 동일하며 그 효과도 완전히 동일하다.

배열을 함수 안에서 선언하면 지역변수가 되고 함수 밖에서 선언하면 전역변수가 되는데 기억 장소나 통용 범위가 일반 변수와 같다. 지역으로 선언된 배열은 함수 내에서만 사용할 수 있고 전역 배열은 프로그램의 어느 곳에서나 사용할 수 있을 것이다. 파괴 시기나 초기화 여부도 일반 변수와 동일한데 그래서 지역 배열은 초기화되지 않는다. 다음 예제를 보자.

 

: Garbage

#include <Turboc.h>

 

void main()

{

     int ar[5];

     int i;

 

     for (i=0;i<5;i++) {

          printf("ar[%d]=%d\n",i,ar[i]);

     }

}

 

main 함수의 지역변수로 ar[5]를 선언만 하고 이 배열 요소의 모든 값을 출력해 보았다. 출력 결과는 다음과 같다. 이 예제를 디버그 모드로 컴파일하면 0xcccccccc로 초기화되는데 이 값은 디버거가 초기화되지 않았음을 표시하기 위한 특별한 값이다. 릴리즈 모드로 컴파일하면 다음과 같이 출력된다.

 

ar[0]=2048

ar[1]=4

ar[2]=34603536

ar[3]=4198834

ar[4]=4222976

 

ar[0]~ar[4]까지 초기화되지 않은 쓰레기값들만 잔뜩 들어 있다. 컴파일러가 지역적으로 선언된 배열을 초기화하지 않고 내버려 두는 이유는 대개의 경우 배열을 선언하자 마자 곧바로 어떤 값을 채워 넣기 때문이다. 앞의 성적 처리 프로그램들은 arScore 배열을 선언한 후 scanf로 사용자에게 입력을 받거나 직접 값을 대입했다. 프로그램이 알아서 배열을 잘 사용하는데 컴파일러가 실행 시간을 낭비해 가며 참견할 필요가 없는 것이다.

C는 성능에 최우선의 가치를 두는 언어이기 때문에 조금이라도 불필요한 동작은 하지 않는다. 물론 전역으로 선언하면 컴파일러가 이 배열을 초기화한다. int ar[5]; 선언문을 main 함수 이전으로 옮겨 전역 선언하면 모든 배열 요소가 0으로 초기화될 것이다. 보다시피 일반 변수의 초기화 규칙과 동일한 규칙이 적용된다. 만약 배열 요소를 원하는 값으로 초기화하려면 루프를 돌면서 배열 요소에 일일이 값을 대입해야 한다.

 

for (i=0;i<5;i++) ar[i]=0;

for (i=0;i<5;i++) ar[i]=i;

 

위쪽 루프는 ar 배열의 모든 요소를 0으로 초기화하며 아래쪽 루프는 각 요소를 자신의 첨자값으로 초기화하였다. 이런 식으로 루프를 돌면서 배열 요소를 직접 초기화할 수 있는 경우는 배열 첨자와 초기값이 일정한 대응 관계에 있을 때만 가능하다. 모두 0이거나 0,1,2,3,4나 2,4,6,8,10같이 말이다.

일정 규칙을 가지지 않는 초기값으로, 예를 들어 4,8,3,69,-7 등의 임의값으로 초기화할 때는 루프를 돌아서는 안되며 별도의 배열 초기화 방법을 사용해야 한다. 다음 항에서 배열을 초기화하는 방법에 대해 알아볼 것이다.