Como inicializar a matriz para 0 em C?


170

Eu preciso de uma grande matriz nula em C como um global. Existe alguma maneira de fazer isso além de digitar

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

?


26
char ZEROARRAY [1024] = {0};

3
Se você precisar alocar memória no heap, também poderá usar calloc (). Por exemplo, char * zeroarray = calloc (1024, sizoef (* zeroarray)); .
Andrei Ciobanu

2
NB calloc é bom para charetc, mas se você quiser uma matriz de ponteiros, defina-os explicitamente para NULL, não há (absurdamente!) Nenhuma garantia de que NULL seja representado como zero-bytes. Isso mesmo que o literal 0represente implicitamente o ponteiro nulo.
Adrian Ratnapala 03/04

Respostas:


284

Variáveis ​​globais e variáveis ​​estáticas são automaticamente inicializadas em zero. Se você simplesmente

char ZEROARRAY[1024];

no escopo global, serão todos os zeros em tempo de execução. Mas na verdade não é uma sintaxe abreviada se você tivesse um array local. Se uma matriz for parcialmente inicializada, os elementos que não foram inicializados receberão o valor 0 do tipo apropriado. Você pode escrever:

char ZEROARRAY[1024] = {0};

O compilador preencheria as entradas não escritas com zeros. Como alternativa, você pode usar memsetpara inicializar a matriz na inicialização do programa:

memset(ZEROARRAY, 0, 1024);

Isso seria útil se você o tivesse alterado e desejasse redefini-lo para todos os zeros.


2
{0}; funciona bem, C99 [$ 6.7.8 / 21] Se houver menos inicializadores em uma lista entre chaves do que elementos ou membros de um agregado, ou menos caracteres em uma string literal usada para inicializar uma matriz de tamanho conhecido do que existem elementos na matriz, o restante do agregado deve ser inicializado implicitamente o mesmo como objectos que têm duração de armazenamento estático
Sasha Zezulinsky

Consulte: O 0 inicializado não é a character. é um integer.
Yonggoo Noh

1
{}discussão: stackoverflow.com/questions/17589533/… memset não está obviamente correto: Eu acho que só funciona para 0: stackoverflow.com/questions/11138188/…
Ciro Santilli #

1
Se é uma matriz de estruturas e o uso -Werror=missing-bracesno gcc, deve ser inicializado como {{0}}. Se o primeiro elemento struct for outro, então {{{0}}}e assim por diante. Veja stackoverflow.com/questions/5434865/…
Tor Klingberg

1
Hoje encontrei o estranho int arr[256]={1,2,7,{0}};... que me trouxe aqui. Nem sabia que esse zeramento parcial era uma coisa até que eu vi.
usar o seguinte

32

Se você deseja inicializar a matriz com valores diferentes de 0, gccfaça o seguinte:

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

Esta é uma extensão GNU dos C99 Designated Initializers . No GCC mais antigo, pode ser necessário -std=gnu99compilar seu código.


14
Inicializadores designados são padrão no C99. O uso de ...para indicar um intervalo é uma extensão específica do gcc.
Keith Thompson

1
Não é um inicializador designado por C99, é um inicializador de intervalo específico do GCC . Por que consultar o manual do GCC em vez do padrão C99?
Craig Barnes
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.