C에서 배열을 0으로 초기화하는 방법은 무엇입니까?


170

C에서 전역으로 큰 null 배열이 필요합니다. 입력하는 것 외에도이 작업을 수행 할 수있는 방법이 있습니까

char ZEROARRAY[1024] = {0, 0, 0, /* ... 1021 more times... */ };

?


26
char ZEROARRAY [1024] = {0};

3
힙에 메모리를 할당해야하는 경우 calloc ()을 사용할 수도 있습니다. 예를 들어 char * zeroarray = calloc (1024, sizoef (* zeroarray)); .
— Andrei Ciobanu

2
NB calloc은 괜찮습니다 char.하지만 포인터 배열을 원한다면 명시 적으로 NULL로 설정해야합니다 (NULL!)! NULL이 0 바이트로 표현된다는 보장은 없습니다. 리터럴이 0암시 적으로 널 포인터를 나타내는 경우 에도 마찬가지 입니다.
— Adrian Ratnapala

답변:


284

전역 변수와 정적 변수는 자동으로 0으로 초기화됩니다. 당신이 단순히 있다면

char ZEROARRAY[1024];

전역 범위에서는 런타임에 모두 0입니다. 그러나 실제로이 있습니다 로컬 배열이 있다면 속기 구문. 배열이 부분적으로 초기화 된 경우 초기화되지 않은 요소는 적절한 유형의 값 0을받습니다. 당신은 쓸 수 있습니다 :

char ZEROARRAY[1024] = {0};

컴파일러는 쓰지 않은 항목을 0으로 채 웁니다. 또는 memset프로그램 시작시 어레이를 초기화하는 데 사용할 수 있습니다 .

memset(ZEROARRAY, 0, 1024);

변경하고 모든 0으로 다시 설정하려는 경우 유용합니다.


2
{0}; C99 [$ 6.7.8 / 21] 중괄호로 묶은 목록에 집계의 요소 또는 멤버보다 적은 이니셜 라이저가 있거나 문자열 리터럴에서 알려진 크기의 배열을 초기화하는 데 사용되는 문자 수가 더 적은 경우 배열의 원소들에서, 집합체의 나머지는 정적 저장 기간을 갖는 객체들과 묵시적으로 초기화되어야한다
— Sasha Zezulinsky

다음을 참조하십시오 : 초기화 된 0이 아닙니다 character. 그것은입니다 integer.
— Yonggoo Noh

1
{}토론 : stackoverflow.com/questions/17589533/… memset 는 분명히 정확하지 않습니다 : 나는 그것이 0에 대해서만 작동한다고 생각합니다 : stackoverflow.com/questions/11138188/…
— Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
구조체 배열이고 -Werror=missing-bracesgcc에서 사용하는 경우로 초기화해야합니다 {{0}}. 첫 번째 구조체 요소가 다른 구조체이면 계속 {{{0}}}됩니다. 참조 stackoverflow.com/questions/5434865/...
— 토르 Klingberg

1
오늘 나는 이상한 것을 만났다 ... int arr[256]={1,2,7,{0}};... 나를 여기로 데려왔다. 이 부분 제로화는 내가보기 전까지는 아무것도 몰랐습니다.
— Neil Gatenby

32

배열을 0 이외의 값으로 초기화하려면 gcc다음을 수행하십시오.

int array[1024] = { [ 0 ... 1023 ] = -1 };

이것은 C99 지정 초기화 프로그램의 GNU 확장입니다 . 이전 GCC에서는 -std=gnu99코드를 컴파일하는 데 사용해야 할 수 있습니다.


14
C99에서는 지정된 이니셜 라이저가 표준입니다. ...범위를 나타내는 용도는 gcc 특정 확장자입니다.
— Keith Thompson

1
그것은 C99로 지정된 이니셜 라이저가 아니며 GCC 관련 범위 이니셜 라이저 입니다. C99 표준 대신 GCC 매뉴얼을 참조해야하는 이유는 무엇입니까?
— Craig Barnes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.