Ear*_*dil -1 c variables static for-loop getline
在下面的代码(我的源代码的简化版本)中,在声明时lv初始化为1右的变量,getline在for循环内部调用时神秘地变为0 .printf如果您输入任何内容"cl",或者通过gdb,您可能会注意到它.变量在getline调用后立即更改值.最奇怪的是,当"cl"提示输入时,你可以通过gdb看到之后lv转向的值,然后在语句中正确设置,然后保存用于后续循环,无论你输入什么.0getline3if
此外,如果您将声明更改为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;
}
Run Code Online (Sandbox Code Playgroud)
一个合乎逻辑的解释是,在你的平台size_t上比大于int.
如果是这种情况,则代码具有UB,并且lv在getline更新时变量会被覆盖len.
简单地声明len为size_t.