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

Is it mandatory to assign default value zero to integer array in 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

从调试器我得到了这张快照: debugger snap shot

输出:

0 
1 
1 
0 
0 
2 
1 
0 
1606415986 
32769

为什么编译器从索引 0 to 7 和索引 81606415986 和索引 932769 设置垃圾值 0

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

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

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

显式初始化它

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

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

if (scanf("%999s", s) != 1) {
    printf("input error\n");
    return 1;
}
函数内部的

int ar[10]; 不会将元素初始化为 0。ar未初始化.

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

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

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

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

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

int ary[10] = {0};

将它们全部初始化为零