是否必须在C中为整数数组指定默认值零?

时间:2018-06-14 15:59:38

标签: c arrays c-strings garbage

我正在实现程序来计算字母数字字符串中的数字频率,但是在花费数小时的奇怪输出之后,我能够找到C将垃圾值设置为所有索引值的解决方案。但令我感到惊讶的是,编译器将某些值设置为零(在我的示例中,它为0索引设置0 to 7,并在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来自索引0 to 71606415986索引832769索引9

任何有助于我深入理解的帮助或链接都将受到赞赏。

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

3 个答案:

答案 0 :(得分:4)

函数内的

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

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

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

关键是良好的代码应该先读取它们或分配它们,然后再阅读它们。

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

答案 1 :(得分:2)

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

显式初始化它

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

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

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

答案 2 :(得分:1)

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

int ary[10] = {0};

将它们全部初始化为零