为什么这个 C 代码可以工作?未初始化的变量有时已经设置为 0

why did this C code ever work? uninitialized variable already set to 0 sometimes

我正在自学 C 和一般编程,并且非常喜欢它,所以这是一个初学者问题。

我在整个程序中使用函数 readLine() 获取未定义长度的用户输入。这是函数:

char *readLine(void){
    int len=128;
    unsigned int i;
    int c=EOF;
    char *input = malloc(len*sizeof(char));
    while((c=getchar())!='\n' && c!=EOF){
        input[i++]=(char)c;
        if (i==len){
            input=realloc(input, sizeof(char)*(len+i));
            len+=i;
        }
    }
    input[i]='[=10=]';
    input=realloc(input,sizeof(char)*(i+1));
    return input;
}

请注意,我 从未初始化 i。哎呀。除了,直到今天,它工作得很好。例如,以下代码完美地获取用户输入:

printf("Enter the hex-encoded cipher: \n");
cipher = readLine();

仍然有效 如果我让 i 未初始化:调试器告诉我 i 默认设置为 0。在我编写的下一段代码中,它停止工作,在调试器中大约十秒钟后,我的头撞到了 table.

问题:为什么有效?为什么i有时没有初始化就已经0了?

因为有时候没有初始化就为0。只是它是未初始化的,这意味着它可以是任何值,包括 0.

它一直在工作,基本上是侥幸。

你只是(不)幸运。

你不能确定 i 的值,因为它是在堆栈上创建的。这是未定义的行为。你 运行 代码和 i 你说的是零,你给我你的代码(或者你 运行 2 天后它)并且 i 有另一个值!

如本文所述answer

The value of an uninitialized local variable in C is indeterminate and reading it invokes undefined behavior.

What is Undefined Behavior (UB)?(致 Alan Au)。


幸运是因为成功了,不幸是因为你没有发现错误!