¿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... */ };

?


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

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.


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
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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.