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.