IT프로그래밍

[C언어]C언어 배열 초기화 / C언어 배열 초기화 소스코드 / C언어 배열 초기화 방법 및 분석

Manniz 2020. 4. 1.

C언어 배열 초기화

 

C언어 배열 초기화에 대해 알아보겠습니다.

 

우선 배열을 초기화 하지 않고 그냥 생성만 한 후에 그 안에 입력되어 있는 값을 보도록 하겠습니다

 

소스코드

#include <stdio.h>
 
int main(void)
{
    int arr[10];            //10개의 크기를 갖는 배열 생성
    int i;
 
    for(i = 0; i < 10; i++)
    {
        printf("%d\n", arr[i]);        //각 배열의 값 출력
    }
}
 
 

배열 초기화를 진행하지 않고 생성만 하였습니다.

arr[10]으로 배열을 생성만 한것이죠

이제 그 안에 어떤 값들이 들어가 있는지 확인해 보겠습니다.

 

배열 생성 후 결과

 

배열에 값을 할당한 적이 없는데 -858993460 으로 전부 값이 차있습니다.

이 값은 흔히 얘기하는 쓰레기(가비지) 값 입니다.

배열을 생성하고 초기화 하지 않으면 그 안은 보시는 바와 같이 쓰레기 값으로 채워져 있습니다.

 

그럼 C언어 배열 초기화를 진행하였을 때는 어떤 값이 들어오는지 확인해보겠습니다.

 

배열 초기화 소스코드

#include <stdio.h>
 
int main(void)
{
    int arr[10= {1};            //10개의 크기를 갖는 배열 생성
    int i;
 
    for(i = 0; i < 10; i++)
    {
        printf("%d\n", arr[i]);        //각 배열의 값 출력
    }
}
 
 

 

아까와 차이점은

int arr[10]; 이

int arr[10] = {1}; 로 바뀐것 입니다.

 

이것의 의미는 10의 크기를 갖느 arr 배열의 첫번째 값을 1로 초기화 하겠다는 것입니다.

결과를 보시죠

 

C언어 배열 초기화 결과

 

아까와 차이가 있습니다.

1. 초기화를 선언한 처음 배열(arr[0]이 되겠죠 ?)에는 우리가 지정한 값 1이 들어가 있습니다.

2. 따로 지정하지 않은 값 0 들이 arr[1] ~ arr[9] 까지 할당되어 있습니다.

 

이것은 포인터의 개념을 갖고 봐야하는데, 간단하게 설명하자면

현재 arr배열의 크기는 10이고 배열이라는 것도 넓게 보면 포인터입니다.

 

예를들어 int a;를 선언했을 때

해당 변수는 메모리의 일정한 주소에 위치하게 됩니다.

int형은 4바이트 이므로 

메모리상의 어딘가에 4바이트로 자리잡게됩니다.

초기화를 해주지 않으면 쓰레기값이 나오는데, 쓰레기값의 정체는 해당 메모리의 번지수입니다.

 

배열은 그 메모리 주소를 할당된 배열의 크기만큼 엮은 모습니다.

예를들어 arr[10]을 선언하였고, 그 배열이 메모리상에 5번이라는 주소에 매핑에 되었다고 하고

설명상 1바이트 = 1개의 주소를 할당 한다고 가정했을 때

앞에서 말한것처럼 int는 4바이트 이기때문에

 

arr[0]    arr[1]         arr[2]           arr[3]......

[5 6 7 8][9 10 11 12][13 14 15 16][17 18 19 20]....

 

으로 매핑이 된것입니다.

 

배열 초기화를 진행하게 되면 int형 같은 경우 0으로 초기화를 시킵니다.

엄밀히 얘기하면 초기화를 진행한 곳 이외에는 바이트 값을 전부 0으로 줍니다.

 

바이트로 보면

[0 0 0 1][0 0 0 0][0 0 0 0].....

으로 가는것이죠.

그래서 배열 초기화를 진행한 첫번째 arr의 인덱스만 1 값을 갖고 있는것이고 나머지는 0으로 초기화가 된것입니다.

 

만약 그 뒤값까지 배열 초기화를 진행하고 싶은 다음과 같이 진행하시면 됩니다.

 

소스코드

#include <stdio.h>
 
int main(void)
{
    int arr[10= {12345};            //10개의 크기를 갖는 배열 생성
    int i;
 
    for(i = 0; i < 10; i++)
    {
        printf("%d\n", arr[i]);        //각 배열의 값 출력
    }
}
 
 

이 코드에서는 arr배열의 5번째 인덱스 까지 배열 초기화를 진행하였습니다.

 

결과는 다음과 같습니다.

5번재 인덱스 까지 배열 초기화 진행

 

역시 배열 초기화를 진행하지 않는 곳에는 자동으로 배열 초기값이 들어가 있는 것이 확인됩니다.

 

그럼 전체 배열 초기화를 진행하고 싶을때는, {}안에 모든 값을 집어넣어야 하는가? 라는 의문이 듭니다.

 

C++로 넘어가도 해당 기능에 대해 지원하는 것이 많은데 C에서 제가 생각하는 배열초기화는 반복문을 사용하는 것이 편하지 않나 싶습니다.

 

0으로 초기화 한다고 하면 제일앞 인자 하나만 초기화 해주면 되겠지만

만약 100으로 모든 배열을 초기화 해주고 싶다. 그리고 배열의 갯수는 1000개이다.

라고 하면 arr[1000] = {100, 100, 100, 100, 100, 100,......}으로 엄청난 노가다이기때문이죠

 

그럼 1000개의 배열을 반복문을 사용하여 초기화 해보겠습니다.

 

소스코드

#include <stdio.h>
 
int main(void)
{
    int arr[1000];            //10개의 크기를 갖는 배열 생성
    int i;
 
    for(i = 0; i <1000; i++)
    {
        arr[i] = 100;            //배열 각각에 초기화 값을 할당
    }
 
    for(i = 0; i < 1000; i++)
    {
        printf("arr[%d] = %d\n", i, arr[i]);        //각 배열의 값 출력
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 

for문을 사용하여 해당 100이라는 값으로 배열 초기화 를 진행하였습니다.

 

결과는 다음과 같습니다.

100으로 모든 배열 초기화 진행

 

잘못되었거나 질문사항은 댓글로 부탁드립니다 !

댓글