是否必须将默认值零分配给 C 中的整数数组?



我正在实施程序来计算字母数字字符串中数字的频率,但是在花费了几个小时的奇怪输出之后,我能够找到C将垃圾值设置为所有索引值的解决方案。但令我惊讶的是编译器将一些值设置为零(在我的示例中,它为0 to 7索引设置0,并在8th9th位置设置一些随机垃圾值(。尽管如此,在四处寻找并与同事讨论之后,我找不到任何解决方案。

在这里,我发布我的代码和输出。

#include <assert.h>
#include <limits.h>
#include <math.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#define MAX_LENGTH  1000
int main()
{
int ar[10];
char s[MAX_LENGTH];
scanf("%s",s);
for(int i = 0; i < strlen(s); i++){
int index = s[i] - 48;
if(index >= 0 && index <= 9){
ar[index] = ar[index] + 1;
}
}
for(int i = 0; i <= 9; i++){
printf("%d n", ar[i]);
}
}

输入 :as12556fsd889ad9

从调试器中,我得到了这个快照: 调试器快照

输出:

0 
1 
1 
0 
0 
2 
1 
0 
1606415986 
32769

为什么编译器从索引0 to 7设置垃圾值01606415986,在索引8设置垃圾值,在索引932769

任何帮助或链接,让我对此有深刻的理解,将不胜感激。

我是初学者和学生,所以请不要对我的问题投反对票。 谢谢

函数内部的int ar[10];不会将元素初始化为 0。ar未初始化

ar[]元素的值是不确定的。 @haccks

编译器可以将它们设置为 0,可以将它们设置为"垃圾",如果访问代码并且它包含陷阱值,或者许多其他可能性。 最有可能的情况是,这些值是内存中碰巧的任何值。

关键是好的代码应该在读取它们之前首先初始化或分配它们。

// char s[MAX_LENGTH];
char s[MAX_LENGTH] = { 0 };

虽然在C 中初始化数组不是强制性的,但根本不应该使用未初始化的值。 代码中的数组ar具有自动存储,因此它是未初始化的。由于代码依赖于初始值为零的事实,因此必须使用int ar[10] = { 0 };显式初始化它

请注意,如果这个数组被定义为全局变量,它将被初始化为0,但如果你要用malloc()分配它,它将是未初始化的。 始终初始化变量不会有什么坏处。

另请注意,您应该测试scanf()的返回值,并将要存储的最大字符数传递到目标数组中:

if (scanf("%999s", s) != 1) {
printf("input errorn");
return 1;
}

如果您希望它们具有可预测的初始值,那么是的。

int ary[10] = {0};

将它们全部初始化为零

最新更新