为什么这个 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)。
幸运是因为成功了,不幸是因为你没有发现错误!
我正在自学 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)。
幸运是因为成功了,不幸是因为你没有发现错误!