C언어

[C 언어] 구조체 초기화 방법

Teodore 2023. 2. 6. 18:08
728x90

지난 글에서는 지역/전역 변수의 초기화 방법에 대해 알아보았다. 

오늘은 구조체의 초기화 방법에 대해 알아보려 한다. 

 

구조체도 마찬가지로 지역 변수, 전역 변수, 동적 할당 등에 따라 초기화 방법이 다르다. 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
typedef struct{
    int data[SIZE];
    int head;
    int tail;
}QUEUE;
 
QUEUE que;
 
int main(void){
    QUEUE que2;
    for(int i = 0; i < 10; i++){
        printf("%d ", que.data[i]);
    } printf("\n");
    for(int i = 0; i < 10; i++){
        printf("%d ", que2.data[i]);
    } printf("\n");
    return 0;
}
cs

위 코드에서 que는 전역 변수, que2는 지역 변수이다. 실행 결과는 아래와 같다. 

지역 변수는 0으로 초기화 되지 않는다

알고 있는 바와 마찬가지로 전역 변수는 자동으로 0으로 초기화되고, 지역 변수는 0으로 초기화되지 않는다.

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
typedef struct{
    int data[SIZE];
    int head;
    int tail;
}QUEUE;
 
int main(void){
    static QUEUE que;
    QUEUE que2;
    for(int i = 0; i < 10; i++){
        printf("%d ", que.data[i]);
    } printf("\n");
    for(int i = 0; i < 10; i++){
        printf("%d ", que2.data[i]);
    } printf("\n");
    return 0;
}
cs

위 코드에서는 que는 static으로 선언되어 전역 변수와 마찬가지로 0으로 초기화되고 que2는 여전히 초기화되지 않은 상태이다.

static으로 선언된 지역 변수는 0으로 초기화된다.

3. 동적 할당 변수 초기화

동적 할당된 구조체의 경우 지역 변수와 마찬가지로 초기화되지 않은 상태이므로 memset을 이용해 아래와 같이 초기화가 필요하다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#define SIZE 10
 
typedef struct {
    int data[SIZE];
    int head;
    int tail;
}QUEUE;
 
int main(void) {
 
    QUEUE* que = (QUEUE * )malloc(sizeof(QUEUE));
    memset(que, 0sizeof(QUEUE));
    for (int i = 0; i < 10; i++) {
        printf("%d ", que->data[i]);
    } printf("\n");
    return 0;
}
 
cs

동적 할당 변수는 memset을 이용해 초기화해야 한다.

4. 사용자 초기화 방법

이 글을 적는 진짜 이유인 구조체 사용자 초기화 방법에 대해 알아보자. 

구조체를 무조건 0으로 초기화 하는 것은 간단하다. 하지만 정확한 목적을 위해 다른 값으로 초기화하는 것은 고민이 필요하다. 

위의 코드에서 QUEUE 구조체는 환형큐로 사용하기 위해 head와 tail을 멤버로 가지고 있는 상태이다. 

환형큐를 제대로 사용하기 위해서는 head는 0으로 tail은 -1로 초기값을 넣어줘야 한다. data는 초기화가 필요 없기 때문에 이 부분은 코드에 들어가지 않아도 되는 상태다. 

이런 경우 초기화 하는 방법은 아래와 같다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#define SIZE 10
 
typedef struct {
    int data[SIZE];
    int head;
    int tail;
}QUEUE;
 
int main(void) {
    QUEUE que = {0};
    QUEUE que2 = {.head = 0, .tail = -1};
    
    printf("head %d, tail %d\n", que.head, que.tail);
    printf("head %d, tail %d\n", que2.head, que2.tail);
    
    return 0;
}
 
cs

위 코드와 같이 각 멤버의 이름을 직접 써서 초기화할 수 있다. 

다만 .head = 0, 과 같은 코드는 C99에서 추가된 방법이므로 이전 버전 사용자에게는 오류가 발생할 수 있다.

728x90