Como inicializar todos os membros de um array com o mesmo valor?

Eu tenho uma grande variedade em C (não em C++ se isso fizer diferença). Eu quero inicializar todos os membros com o mesmo valor. Eu poderia jurar que uma vez conheci uma maneira simples de fazer isso. Eu poderia usar memset() no meu caso, mas existe'não existe uma maneira de fazer isso que é construída diretamente na sintaxe do C?

Solução

A menos que esse valor seja 0 (nesse caso, você pode omitir alguma parte do inicializador e os elementos correspondentes serão inicializados a 0), não há uma maneira fácil.

Mas não se esqueça da solução óbvia:

int myArray[10] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };

Os elementos com valores em falta serão inicializados a 0:

int myArray[10] = { 1, 2 }; // initialize to 1,2,0,0,0...

Assim, isto inicializará todos os elementos a 0:

int myArray[10] = { 0 }; // all elements 0

Em C++, uma lista de inicialização vazia também inicializará cada elemento a 0. Isto é não permitido com C:

int myArray[10] = {}; // all elements 0 in C++

Lembre-se que objetos com duração de armazenamento estático serão inicializados a 0 se não inicializador é especificado:

static int myArray[10]; // all elements 0

E esse "0" não significa necessariamente "tudo-bits-zero", por isso usar o acima é melhor e mais portátil que memset(). (Os valores dos pontos flutuantes serão inicializados a +0, apontadores para valor nulo, etc.)

Comentários (17)

Você pode fazer toda a coisa do inicializador estático como detalhado acima, mas pode ser uma grande chatice quando o tamanho do seu array muda (quando o seu array embigena, se você não adicionar os inicializadores extras apropriados você recebe lixo).

memset lhe dá um hit de tempo de execução para fazer o trabalho, mas nenhum hit de tamanho de código feito corretamente é imune a mudanças de tamanho de matriz. Eu usaria esta solução em quase todos os casos quando o array fosse maior do que, digamos, algumas dezenas de elementos.

Se fosse realmente importante que o array fosse declarado estaticamente, eu escreveria um programa para escrever o programa para mim e torná-lo parte do processo de construção.

Comentários (1)

Para inicializar tipos de dados 'normais' (como em arrays int), você pode usar a notação de colchetes, mas ela zerará os valores após o último se ainda houver espaço no array:

// put values 1-8, then two zeroes
int list[10] = {1,2,3,4,5,6,7,8};
Comentários (0)