일반 변수의 초기화에 대해서는 일반적으로 알고 있는 내용이 많다.
그렇지만 전문적으로 프로그램을 개발하기 위해서는 정확하게 변수의 생성 위치와 초기화 원리를 알고 있는 것이 좋다.
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으로 초기화 된 것을 알 수 있다.
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] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
|
cs |
전역 변수의 경우 위와 같이 초기화가 가능하다. 만약 모든 값을 초기화 하지 않고 일부 필드만 초기화 하고 싶다면 아래와 같이 하면 된다.
1
|
int arrA[10] = { 10, 9, 8, 7, };
|
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, 0, 10 * sizeof(int));
for (int i = 0; i < 10; i++) {
printf("%d ", arrA[i]);
} printf("\n");
return 0;
}
|
cs |
오늘은 배열 변수가 초기화 되는 것에 대해 알아보았는데, 일반 변수도 동일하다. 다만, 구조체에 대해서는 조금 더 생각해 볼 필요가 있다. 구조체 관련 얘기는 다음에 추가로 적어보려고 한다. 오늘은 여기까지
'C언어' 카테고리의 다른 글
[C 언어] 포인터(Pointer)의 이해 (2) | 2023.02.25 |
---|---|
[C 언어] 구조체 초기화 방법 (0) | 2023.02.06 |
[C 언어] Dangling pointer (0) | 2023.01.28 |
[C 언어] 연산자 우선순위 (0) | 2023.01.26 |
[C 언어] 비트필드 구조체에 대해 알아보자 (0) | 2023.01.21 |