我目前正在学习 C 语言,同时遵循《C 书》,其中一项练习是编写一个程序,让用户输入一个数字,然后程序会返回该数字。
在对我的代码进行故障排除时,我注意到我放入数字的数组中填充了......随机数据?
我觉得这很奇怪。这是正常的吗?如果是,为什么会发生这种情况?
这是我的代码:
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;
}
静态数组或全局范围内的数组将被初始化。像您这样的具有自动存储期限的本地数组
numbers
不能保证被初始化,并且它们包含的值是不确定的。可能性包括您看到的“垃圾”值。如果未初始化这些值就使用这些值,则会导致未定义的行为。
值得注意的是,这里真正的危险在于它们可能正是您所期望的。也许您在调试模式下编译,并且数组确实被初始化为包含零。就您所知,您的程序运行良好。然后您在发布模式下编译,您认为有效的代码开始出现非常奇怪的错误。
编译时启用警告将有助于识别未定义行为的来源。编译时将警告显示为错误将迫使您解决警告。