HOWTO · C

C에서 배열을 0으로 초기화

이 튜토리얼에서는 C에서 배열을 0으로 초기화하는 다양한 방법을 소개합니다.

이 페이지의 내용

int 배열을 선언할 때 모든 요소를 0으로 초기화하려면 int values[5] = {0};을 사용하세요. C에서는 첫 번째 요소를 0으로 초기화하고, 집계 초기화 규칙에 따라 나머지 요소도 모두 0으로 초기화합니다. 배열이 이미 선언되어 있다면 반복문으로 각 요소에 값을 대입하세요. memset은 배열의 바이트를 0으로 채울 수 있지만, 바이트를 채우는 방식이 타입에 맞는 초기화를 항상 대신할 수 있는 것은 아닙니다.

선언할 때 배열을 0으로 초기화하기

배열을 선언하면서 크기를 알고 있다면 초기화식을 사용하세요. 다음 완전한 예제는 초기화된 다섯 값을 출력합니다.

#include <stdio.h>

int main(void) {
    int values[5] = {0};
    for (size_t i = 0; i < sizeof values / sizeof values[0]; ++i) {
        printf("%d%s", values[i], i == 4 ? "\n" : " ");
    }
    return 0;
}
0 0 0 0 0

{0} 초기화식은 첫 번째 요소를 명시적으로 0으로 초기화하고, 집계 초기화 규칙에 따라 생략한 요소도 0으로 초기화합니다. 정적 또는 스레드 저장 기간을 갖는 객체는 초기화식을 생략해도 됩니다. C가 자동으로 0으로 초기화하기 때문입니다. 일반적인 초기화되지 않은 지역 배열은 자동 저장 기간을 가지므로 요소가 자동으로 0이 되지 않습니다. 값을 읽기 전에 초기화식을 지정하거나 각 요소에 값을 대입하세요.

반복문으로 배열을 0으로 초기화하기

배열을 이미 선언했거나 실행 중에 값을 정해야 한다면 반복문을 사용할 수 있습니다. 다음 완전한 예제는 배열의 요소 수를 반복 범위로 사용하고 결과를 출력합니다.

#include <stdio.h>

int main(void) {
    int values[5];
    size_t count = sizeof values / sizeof values[0];

    for (size_t i = 0; i < count; ++i) {
        values[i] = 0;
    }
    for (size_t i = 0; i < count; ++i) {
        printf("%d%s", values[i], i + 1 == count ? "\n" : " ");
    }
    return 0;
}
0 0 0 0 0

여기서는 values가 포인터 매개변수가 아니라 같은 범위에 있는 배열이므로 sizeof를 사용할 수 있습니다. 배열을 함수에 전달할 때는 길이도 별도로 전달하세요. 함수 안에서는 배열 매개변수가 포인터로 조정되므로 sizeof는 포인터의 크기를 반환합니다.

memset()을 주의해서 사용하기

표준 라이브러리 함수 memset은 메모리 영역 전체에 같은 바이트 값을 씁니다. <string.h>를 포함하고, 다음 완전한 예제처럼 범위 안에 있는 배열 전체를 대상으로 sizeof values를 사용하세요.

#include <stdio.h>
#include <string.h>

int main(void) {
    int values[5];
    memset(values, 0, sizeof values);

    for (size_t i = 0; i < sizeof values / sizeof values[0]; ++i) {
        printf("%d%s", values[i], i == 4 ? "\n" : " ");
    }
    return 0;
}
0 0 0 0 0

세 번째 인수는 바이트 수이므로 이 배열에는 sizeof values가 맞습니다. memset은 각 요소에 타입이 지정된 값을 대입하는 대신 모든 비트가 0인 표현을 씁니다. 요소 타입과 플랫폼에서 그 표현이 적절한 경우에만 사용하세요. 배열을 선언할 때 이식성 있게 의미상 0으로 초기화하려면 {0}을 사용하는 편이 좋습니다. 모든 C 구현에서 0 바이트가 널 포인터나 부동 소수점 0을 나타낸다고 가정하지 마세요.

0이 아닌 값으로 배열 초기화하기

초기화식에 원하는 값을 나열하세요. 예를 들면 int values[] = {2, 4, 6};과 같습니다. C는 초기화식의 개수로 바깥쪽 차원의 크기를 추론합니다. 다차원 배열에서는 다음 형식처럼 바깥쪽 차원만 생략할 수 있으며, 안쪽 차원은 지정해야 합니다: int grid[][3] = {{1, 2, 3}, {4, 5, 6}};.

int values[5] = {[0 ... 4] = 7};과 같은 GNU 범위 지정자는 GCC 확장이며, 이식 가능한 표준 C 문법이 아닙니다. 여러 C 컴파일러에서 이식성을 확보해야 한다면 일반 초기화식 목록이나 반복문을 사용하세요. (int[]){1, 2, 3}과 같은 복합 리터럴은 이 함수 문맥에서 블록 수명을 갖는 이름 없는 배열을 만듭니다. 동적 할당이 아니며, 일반적인 초기화를 위해 이름 있는 배열을 선언하는 방법을 대신하지도 않습니다.