본문 바로가기

윤성우의 C Programming

C 언어에서 배열을 초기화할 때 값을 안 넣어도 될까?

결론적으로 C 언어에서 전역 변수로 선언된 구조체 배열은 초기화 시 값을 지정하지 않아도 자동으로 0또는 NULL 로 초기화된다. 왜냐하면 전역 변수가 데이터 세그먼트에 저장되며, 이 영역의 모든 메모리는 실행 시 초기화되기 때문이다.

그러나 지역 변수로 선언된 구조체 배열은 자동으로 초기화되지 않기 때문에 값을 지정하지 않으면 쓰레기 값을 초기화 된다. 이는 프로그램의 동작을 예측할 수 없게 만들고 버그의 원인이 될 수 있다. 

 

전역변수 구조체 배열 예제

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

struct Point {
    int x, y;
};

// 전역 변수로 선언된 구조체 배열
struct Point points_initialized[3] = { {1, 2}, {3, 4}, {5, 6} }; // 명시적 초기화
struct Point points_uninitialized[3]; // 초기화하지 않음

int main() {
    printf("Initialized Global Points:\n");
    for (int i = 0; i < 3; i++) {
        printf("Point %d: (%d, %d)\n", i, points_initialized[i].x, points_initialized[i].y);
    }

    printf("\nUninitialized Global Points (Automatically initialized to 0):\n");
    for (int i = 0; i < 3; i++) {
        // 초기화하지 않은 전역 변수 구조체 배열은 자동으로 0으로 초기화됨
        printf("Point %d: (%d, %d)\n", i, points_uninitialized[i].x, points_uninitialized[i].y);
    }

    return 0;
}
Initialized Global Points:
Point 0: (1, 2)
Point 1: (3, 4)
Point 2: (5, 6)

Uninitialized Global Points (Automatically initialized to 0):
Point 0: (0, 0)
Point 1: (0, 0)
Point 2: (0, 0)

 

이 예제에서 points_initialized 배열은 명시적으로 초기화되어 있으며, points_uninitialized 배열은 초기화하지 않았다. 코드 실행 결과, points_initialized는 개발자가 지정한 값으로 출력되고, points_uninitialized는 모든 멤버가 자동으로 0으로 초기화된 것을 확인할 수 있.

 

 

지역변수 구조체 배열 예제

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

struct Point {
    int x, y;
};

int main() {
    struct Point points_initialized[3] = { {1, 2}, {3, 4}, {5, 6} };
    struct Point points_uninitialized[3]; // 초기화하지 않음

    printf("초기화 구조체 배열:\n");
    for (int i = 0; i < 3; i++) {
        printf("Point %d: (%d, %d)\n", i, points_initialized[i].x, points_initialized[i].y);
    }

    printf("\n초기화하지 않은 구조체 배열:\n");
    for (int i = 0; i < 3; i++) {
        // 초기화하지 않은 구조체 배열의 값들은 쓰레기 값일 수 있음
        printf("Point %d: (%d, %d)\n", i, points_uninitialized[i].x, points_uninitialized[i].y);
    }

    return 0;
}
초기화 구조체 배열:
Point 0: (1, 2)
Point 1: (3, 4)
Point 2: (5, 6)

초기화하지 않은 구조체 배열:
Point 0: (-858993460, -858993460)
Point 1: (-858993460, -858993460)
Point 2: (-858993460, -858993460)

 

이 코드는 초기화된 구조체 배열과 초기화되지 않은 구조체 배열을 비교하여 출력한다. 초기화되지 않은 배열의 값은 쓰레기 값(정의되지 않은 값)이 출력될 수 있음을 보여준다.