将未初始化的数组计数增加到4195520,C

将未初始化的数组计数增加到4195520,C,c,arrays,C,Arrays,在下面的示例中,我想了解为什么将4195520的值添加到chars[2]计数空间 char input; int chars[4]; // [0] = newlines; [1] = tabs; [2] = spaces; [3] = all_else int i, j; printf("--\n"); printf("please enter input\n"); printf("~[enter] to end\n\n"); while ((input = getchar()) != E

在下面的示例中,我想了解为什么将4195520的值添加到chars[2]计数空间

char input;
int chars[4];  // [0] = newlines; [1] = tabs; [2] = spaces; [3] = all_else 
int i, j;

printf("--\n");
printf("please enter input\n");
printf("~[enter] to end\n\n");
while ((input = getchar()) != EOF) {
    if (input == '\n') {++chars[0];}
    else if (input == '\t') {++chars[1];}
    else if (input == ' ') {++chars[2];}  // 4195520 is added (plus the amount of actual spaces), but only if I add to an array member
                                          // if I increment an integer variable, it counts correctly
    else if (input == '~') {printf("\n"); break;}
    else {++chars[3];}
}

printf("--\n");
printf("the frequency of different characters\n");
printf("each dot represents one occurance\n");
for (i=0; i<=3; ++i) {
    if (i == 0) {printf("newlines:\t");}
    else if (i == 1) {printf("tabs:\t\t");}
    else if (i == 2) {printf("spaces:\t\t");}
    else if (i == 3) {printf("all else:\t");}
    for (j=0; j<chars[i]; ++j) {printf(".");}  // ~4.2 million dots are printed for spaces
    printf("\n");
}

正确计数的解决方案是将数组成员初始化为0,但我想了解为什么只有空格以及为什么只使用数组成员作为计数器,每次递增到数字4195520。

这是垃圾值:由于以前的操作,某个值恰好位于特定的内存位置,而且还没有被清除。这次您可能会得到4195520,但如果您运行其他程序,然后重新运行代码,您可能会看到一些不同的东西。你几乎肯定会在不同的机器上看到不同的东西

正如您所注意到的,正确的计数方法是:

int chars[4] = {0};

没有合理的解释。如果数组未初始化,则其成员可以是任何对象,包括4195520。您正在计算、递增和分配以初始不确定值为前提的数据,这是未定义的行为。@H2CO3-不正确。有一个合理的解释,既可以清楚地理解,也可以解释。@BlaineM:清楚地定义是什么?不是按C标准。如果你问一个关于C编程语言的问题,那么你的特定计算机可能会做一件特定的事情这一事实既不存在也不存在。在某些情况下,它甚至可能对原则上不可预测的事件敏感,例如,如果你的系统状态间接地依赖于某些量子现象的输出。所需要的只是通过互联网从使用[硬件随机数生成器]的源接收一些数据。99%以上的时间,不值得担心;在尝试读取变量之前,请确保初始化所有变量。是的,我发现初始化数组成员解决了问题,但我没有意识到垃圾值。我一直在想象编译器中的一个过程会经历400万次添加。我将进一步了解垃圾值。谢谢@BlaineM建议你花时间阅读更多关于未定义行为的内容。