C:变量变为0,只需在for循环中调用getline

Ear*_*dil -1 c variables static for-loop getline

在下面的代码(我的源代码的简化版本)中,在声明时lv初始化为1右的变量,getlinefor循环内部调用时神秘地变为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)

Kar*_*ath 9

一个合乎逻辑的解释是,在你的平台size_t上比大于int.

如果是这种情况,则代码具有UB,并且lvgetline更新时变量会被覆盖len.

简单地声明lensize_t.