¿Cómo inicializar la matriz a 0 en C?

170

Necesito una gran matriz nula en C como global. ¿Hay alguna manera de hacer esto además de escribir?

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

?

Claudiu
fuente
26
char ZEROARRAY [1024] = {0};
3
Si alguna vez necesita asignar memoria en el montón, también puede usar calloc (). Por ejemplo char * zeroarray = calloc (1024, sizoef (* zeroarray)); .
Andrei Ciobanu
2
NB calloc está bien para charetc., pero si desea una matriz de punteros, debe establecerlos explícitamente en NULL, no hay (¡absurdamente!) Ninguna garantía de que NULL se represente como cero bytes. Esto a pesar de que el literal 0implícitamente representa el puntero nulo.
Adrian Ratnapala
Posible duplicado de Cómo inicializar una matriz en C
AechoLiu

Respuestas:

284

Las variables globales y las variables estáticas se inicializan automáticamente a cero. Si tienes simplemente

char ZEROARRAY[1024];

a escala global, todos serán ceros en tiempo de ejecución. Pero en realidad no es una sintaxis abreviada si has tenido una matriz local. Si una matriz se inicializa parcialmente, los elementos que no se inicializan reciben el valor 0 del tipo apropiado. Podrías escribir:

char ZEROARRAY[1024] = {0};

El compilador llenaría las entradas no escritas con ceros. Alternativamente, podría usar memsetpara inicializar la matriz al inicio del programa:

memset(ZEROARRAY, 0, 1024);

Eso sería útil si lo hubiera cambiado y quisiera restablecerlo a todos los ceros.

John Kugelman
fuente
2
{0}; funciona bien, C99 [$ 6.7.8 / 21] Si hay menos inicializadores en una lista entre llaves que elementos o miembros de un agregado, o menos caracteres en un literal de cadena utilizado para inicializar una matriz de tamaño conocido de lo que hay elementos en la matriz, el resto del agregado se inicializará implícitamente igual que los objetos que tienen una duración de almacenamiento estático
Sasha Zezulinsky
Consulte: El 0 inicializado no es a character. se trata de una integer.
Yonggoo Noh
1
{}discusión: stackoverflow.com/questions/17589533/… memset no es obviamente correcto: creo que solo funciona para 0: stackoverflow.com/questions/11138188/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
Si se trata de una matriz de estructuras y se usa -Werror=missing-bracesen gcc, debe inicializarse en {{0}}. Si el primer elemento de estructura es otra estructura, entonces, {{{0}}}etc. Ver stackoverflow.com/questions/5434865/…
Tor Klingberg el
1
Hoy me encontré con lo extraño ... int arr[256]={1,2,7,{0}};... que me trajo aquí. Ni siquiera sabía que esta reducción a cero parcial era una cosa hasta que lo vi.
Neil Gatenby
32

Si desea inicializar la matriz a valores distintos de 0, gccpuede hacer lo siguiente:

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

Esta es una extensión de GNU de los inicializadores designados C99 . En GCC anteriores, es posible que deba usar -std=gnu99para compilar su código.

Deqing
fuente
14
Los inicializadores designados son estándar en C99. El uso de ...para denotar un rango es una extensión específica de gcc.
Keith Thompson el
1
Ese no es un inicializador designado C99, es un inicializador de rango específico de GCC . ¿Por qué consultar el manual de GCC en lugar del estándar C99?
Craig Barnes