在下面的代码(源代码的简化版本)中,变量lv
在声明后立即初始化为1
,而在getline
循环内调用for
时,其变量神秘地变为0。如果输入除printf
以外的任何内容,或者通过gdb,您可能会从"cl"
中注意到它。变量在getline
调用后立即更改值。
最奇怪的是,在出现提示时输入"cl"
时,您可能会通过gdb看到lv
的值在0
之后立即变为getline
,然后在3
中将其正确设置为if
>语句,然后为后续循环保留,无论您输入什么。
此外,如果将声明更改为static int lv = 1;
,则预期的行为会发生(lv
会保留为1
,直到“手动”更改)。
有人可以告诉我这到底是怎么回事吗?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main ( void ) {
char* line=NULL;
int len;
int lv = 1;
for(;;) {
printf("Level: %d\n", lv);
getline(&line, (size_t*)&len, stdin);
if (line[strlen(line) - 1] == '\n') {
line[strlen(line) - 1] = '\0';
}
if (strcmp(line, "cl")==0) {
lv = 3;
} else if (strcmp(line, "hi")==0) {
printf("Hello World!\n");
} else if (strcmp(line, "quit")==0) {
break;
}
}
return 0;
}
最佳答案
合理的解释是,您平台上的size_t
大于int
。
在这种情况下,您的代码包含UB,并且lv
变量在getline
更新len
时被覆盖。
只需将len
声明为size_t
。