C언어

[C 언어] 변수 초기화에 관해서 (전역, 지역 변수)

Teodore 2023. 2. 6. 17:41
728x90

일반 변수의 초기화에 대해서는 일반적으로 알고 있는 내용이 많다.
그렇지만 전문적으로 프로그램을 개발하기 위해서는 정확하게 변수의 생성 위치와 초기화 원리를 알고 있는 것이 좋다.

1. 전역 변수 / 지역 변수 초기화

일반적인 변수들을 크게 나누자면 전역 변수와 지역 변수로 나눌 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
int g_arr[10];
 
int main(void){
    int s_arr[10];
    for(int i = 0; i < 10; i++){
        printf("%d ", g_arr[i]);
    } printf("\n");
    for(int i = 0; i < 10; i++){
        printf("%d ", s_arr[i]);
    } printf("\n");
    return 0;
}
cs

위 코드에서 g_arr는 전역 변수로 기본적으로 bss 영역에 할당되므로 0으로 초기화 된다. s_arr는 지역 변수로 사용자의 초기화가 필요하다. 실행 결과는 아래와 같이 지역 변수는 초기화되지 않은 값을 가지고 있는 것을 알 수 있다.

출력 결과 : 지역 변수는 초기화가 되어 있지 않다

 

2. 지역 변수 / static 변수 초기화

함수 안의 지역 변수라 하더라도 일반 지역 변수와 static으로 선언된 지역 변수가 있다.
아래의 코드를 살펴보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void print_static_arr(void) {
    static int a[10];
    for (int i = 0; i < 10; i++) {
        printf("%d ", a[i]);
    } printf("\n");
}
 
void print_normal_arr(void) {
    int a[10];
    for (int i = 0; i < 10; i++) {
        printf("%d ", a[i]);
    } printf("\n");
}
 
int main(void) {
    print_normal_arr();
    print_static_arr();
    return 0;
}
 
cs

print_static_arr에 선언된 a는 static으로 선언되어 있고, 이는 전역 변수와 같은 성질을 띄기 때문에 자동으로 0으로 초기화 되는 것을 확인할 수 있다. 아래 출력 결과를 봐도 0으로 초기화 된 것을 알 수 있다.

static으로 선언한 변수는 초기화 된다.

3. 동적 할당 변수 초기화

그렇다면 동적할당한 변수는 어떻게 될까. 짐작한 바와 같이 초기화되지 않은 상태로 메모리가 할당된 것을 볼 수 있다.

1
2
3
4
5
6
7
8
9
int main(void) {
    int* arrA = (int*)malloc(10 * sizeof(int));
    
    for (int i = 0; i < 10; i++) {
        printf("%d ", arrA[i]);
    } printf("\n");
 
    return 0;
}
cs

 

동적 할당한 변수도 사용자의 초기화가 필요하다

 

4. 사용자 초기화 방법

4-1 전역 변수 사용자 초기화

1
int arr[10= { 10987654321 };
cs

전역 변수의 경우 위와 같이 초기화가 가능하다. 만약 모든 값을 초기화 하지 않고 일부 필드만 초기화 하고 싶다면 아래와 같이 하면 된다.

1
int arrA[10= { 10987, };
cs

위와 같이 표현하면 arrA의 0~3 index의 값이 초기화 되고 나머지 값은 0으로 초기화 된다.
반대로 아래와 같은 초기화는 에러가 발생하므로 사용에 주의해야 한다.

1
int arrA[10= { ,,,,10,9,8, };
cs

 

4-2 지역 변수 사용자 초기화

지역 변수를 0으로 초기화 하는 방법은 아래와 같이 3가지가 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main(void) {
    int arrA[10= {};
    int arrB[10= { 0 };
    int arrC[10= {0 , };
    for (int i = 0; i < 10; i++) {
        printf("%d ", arrA[i]);
    } printf("\n");
    for (int i = 0; i < 10; i++) {
        printf("%d ", arrB[i]);
    } printf("\n");
    for (int i = 0; i < 10; i++) {
        printf("%d ", arrC[i]);
    } printf("\n");
    return 0;
}
cs

다른 값으로 초기화 하는 것은 4-1의 전역 변수와 동일하고 일반적으로 많이 사용하는 0으로 초기화 하는 방법을 적어보았다. 나는 개인적으로 3번째 방법을 사용한다.

4-3 동적 변수 사용자 초기화

마지막으로 동적 배열에 대한 초기화는 별도로 없기 때문에 memset등을 이용해 주로 초기화 한다. 아래와 같다.

1
2
3
4
5
6
7
8
int main(void) {
    int* arrA = (int*)malloc(10 * sizeof(int));
    memset(arrA, 010 * sizeof(int));
    for (int i = 0; i < 10; i++) {
        printf("%d ", arrA[i]);
    } printf("\n");
    return 0;
}
cs


오늘은 배열 변수가 초기화 되는 것에 대해 알아보았는데, 일반 변수도 동일하다. 다만, 구조체에 대해서는 조금 더 생각해 볼 필요가 있다. 구조체 관련 얘기는 다음에 추가로 적어보려고 한다. 오늘은 여기까지

 

728x90