HOWTO · C
Inicializar um Array a 0 em C
Este tutorial introduz diferentes formas de inicializar um array a 0 em C
Nesta página
Para inicializar todos os elementos de um array de int com zero na declaração, use int values[5] = {0};. Em C, o primeiro elemento é inicializado explicitamente com 0, e os demais elementos do agregado também são inicializados com zero. Se o array já tiver sido declarado, atribua um valor a cada elemento em um laço. memset pode preencher os bytes de um array com zeros, mas preencher bytes não substitui, de modo geral, a inicialização de valores tipados.
Inicializar um array com zero na declaração
Use um inicializador quando souber o tamanho do array no momento da declaração. O exemplo completo a seguir imprime os cinco valores inicializados.
#include <stdio.h>
int main(void) {
int values[5] = {0};
for (size_t i = 0; i < sizeof values / sizeof values[0]; ++i) {
printf("%d%s", values[i], i == 4 ? "\n" : " ");
}
return 0;
}
0 0 0 0 0
O inicializador {0} atribui explicitamente zero ao primeiro elemento; a inicialização do agregado atribui zero aos elementos omitidos. Também é possível omitir o inicializador de um objeto com duração de armazenamento estática ou de thread: C o inicializa automaticamente com zero. Um array local comum sem inicializador tem duração de armazenamento automática, portanto seus elementos não são definidos automaticamente como zero. Adicione um inicializador ou atribua valores aos elementos antes de lê-los.
Inicializar um array com zero usando um laço
Um laço é útil quando o array já foi declarado ou quando os valores são escolhidos durante a execução. Este exemplo completo usa a quantidade de elementos do array como limite do laço e imprime o resultado.
#include <stdio.h>
int main(void) {
int values[5];
size_t count = sizeof values / sizeof values[0];
for (size_t i = 0; i < count; ++i) {
values[i] = 0;
}
for (size_t i = 0; i < count; ++i) {
printf("%d%s", values[i], i + 1 == count ? "\n" : " ");
}
return 0;
}
0 0 0 0 0
A expressão sizeof funciona aqui porque values é um array no mesmo escopo, e não um parâmetro do tipo ponteiro. Se passar um array para uma função, passe o comprimento separadamente; dentro da função, o parâmetro é ajustado para um ponteiro, e sizeof retorna o tamanho do ponteiro.
Use memset() com cuidado
A função da biblioteca padrão memset grava o mesmo valor de byte em uma região da memória. Inclua <string.h> e use sizeof values para abranger todo o array no escopo atual, como no exemplo completo a seguir.
#include <stdio.h>
#include <string.h>
int main(void) {
int values[5];
memset(values, 0, sizeof values);
for (size_t i = 0; i < sizeof values / sizeof values[0]; ++i) {
printf("%d%s", values[i], i == 4 ? "\n" : " ");
}
return 0;
}
0 0 0 0 0
O terceiro argumento é uma quantidade de bytes, portanto sizeof values está correto para este array. memset não atribui um valor tipado a cada elemento; grava uma representação com todos os bits iguais a zero. Use essa função somente quando essa representação for adequada ao tipo dos elementos e à plataforma. Para uma inicialização semântica e portátil com zero na declaração do array, prefira {0}. Não suponha que bytes zerados representem um ponteiro nulo ou o zero de ponto flutuante em todas as implementações de C.
Inicializar um array com valores diferentes de zero
Liste os valores desejados no inicializador, por exemplo, int values[] = {2, 4, 6};. C infere a dimensão externa a partir da quantidade de inicializadores. Em um array multidimensional, somente a dimensão externa pode ser omitida nesta forma: int grid[][3] = {{1, 2, 3}, {4, 5, 6}};; a dimensão interna precisa ser especificada.
Designadores de intervalo GNU, como int values[5] = {[0 ... 4] = 7};, são uma extensão do GCC, e não uma sintaxe portátil do C padrão. Use uma lista de inicializadores comum ou um laço quando precisar de portabilidade entre compiladores C. Um literal composto, como (int[]){1, 2, 3}, cria um array sem nome com duração de bloco neste contexto de função; não é uma alocação dinâmica nem substitui uma declaração de array nomeado para inicialização geral.