Como o compilador preenche valores char array[100] = {0};
? Qual é a mágica por trás disso?
Eu queria saber como o compilador é inicializado internamente.
Como o compilador preenche valores char array[100] = {0};
? Qual é a mágica por trás disso?
Eu queria saber como o compilador é inicializado internamente.
Respostas:
Isso não é mágico.
O comportamento desse código em C é descrito na seção 6.7.8.21 da especificação C ( rascunho online da especificação C ): para os elementos que não têm um valor especificado, o compilador inicializa os ponteiros para NULL e os tipos aritméticos para zero ( e recursivamente aplica isso a agregados).
O comportamento desse código em C ++ é descrito na seção 8.5.1.7 da especificação C ++ ( rascunho online da especificação C ++ ): o compilador inicializa os elementos que não têm um valor especificado.
Além disso, observe que no C ++ (mas não no C), você pode usar uma lista vazia de inicializadores, fazendo com que o compilador inicialize agregado todos os elementos da matriz:
char array[100] = {};
Quanto ao tipo de código que o compilador pode gerar ao fazer isso, dê uma olhada nesta pergunta: Montagem estranha da inicialização da matriz 0
A implementação depende dos desenvolvedores do compilador.
Se sua pergunta for "o que acontecerá com essa declaração" - o compilador definirá o primeiro elemento da matriz com o valor que você forneceu (0) e todas as outras serão definidas como zero porque é um valor padrão para os elementos da matriz omitidos.
Se o seu compilador for o GCC, você também poderá usar a seguinte sintaxe:
int array[256] = {[0 ... 255] = 0};
Consulte http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html#Designated-Inits e observe que esse é um recurso específico do compilador .
Depende de onde você coloca essa inicialização.
Se a matriz for estática como em
char array[100] = {0};
int main(void)
{
...
}
então é o compilador que reserva os 100 0 bytes no segmento de dados do programa. Nesse caso, você poderia ter omitido o inicializador.
Se sua matriz é automática, é outra história.
int foo(void)
{
char array[100] = {0};
...
}
Nesse caso, a cada chamada da função foo, você terá um memset oculto.
O código acima é equivalente a
int foo(void)
{
char array[100];
memset(array, 0, sizeof(array));
....
}
e se você omitir o inicializador, sua matriz conterá dados aleatórios (os dados da pilha).
Se sua matriz local for declarada estática como em
int foo(void)
{
static char array[100] = {0};
...
}
então é tecnicamente o mesmo caso que o primeiro.