Atualmente, estou aprendendo C enquanto sigo o livro The C Book e um dos exercícios é escrever um programa que permite ao usuário inserir um número, que o programa retornará depois.
Ao solucionar problemas no meu código, percebi que o array no qual estou colocando os dígitos está preenchido com... dados aleatórios?
Isso me parece estranho. Isso é normal? Se sim, por que isso acontece?
Aqui está meu código:
int main() {
int numbers[20], index;
index = 0;
int num = getchar();
while (num != '\n') {
numbers[index] = num - 48; // ASCII "0" starts at 48
index++;
num = getchar();
}
for (int i = 0; i < index; i++) {
printf("%d", numbers[i]);
}
printf("\n");
return 0;
}
Matrizes estáticas ou matrizes em escopo global serão inicializadas. Matrizes locais com duração de armazenamento automática como a sua
numbers
não têm garantia de serem inicializadas e os valores que elas contêm são indeterminados. As possibilidades incluem os valores "lixo" que você está vendo.Usar esses valores sem inicializá-los leva a um comportamento indefinido .
Vale ressaltar que o perigo real aqui é que eles podem ser o que você espera. Talvez você compile em um modo de depuração e o array seja inicializado para conter zeros. Seu programa funciona bem, até onde você pode ver. Então você compila em um modo de lançamento, e o código que você achava que funcionava começa a exibir bugs muito estranhos.
Compilar com avisos ativados ajudará a identificar fontes de comportamento indefinido. Compilar com avisos como erros o obrigará a lidar com os avisos.