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

C: Variable turns to 0 simply calling getline inside for loop

在下面的代码(我的源代码的简化版)中,变量 lv 在声明时初始化为 1,当在内部调用 getline 时神秘地变为 0 for 循环。如果您输入 "cl" 以外的任何内容,或者通过 gdb,您可能会从 printf 中注意到它。变量在 getline 调用后立即更改值。 最奇怪的是提示输入"cl"时,通过gdb可以看到lv的值刚好在getline之后变成了0,那么就设置正确了到 if 语句中的 3 然后保留用于后续循环,无论您输入什么。

此外,如果您将声明更改为 static int lv = 1;,则会发生预期的行为(lv 保持为 1,直到 'manually' 更改)。

谁能告诉我这到底是怎么回事?

#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] = '[=10=]';
    }
    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

编译器会列出的一个问题是 getline()(在 linux 上)在 stdio.h 中没有原型,除非这样写:

   #define _GNU_SOURCE
   #include <stdio.h>
   #include <stdlib.h>

编译器还提出了另外两个关于未使用参数的警告 'argc' 和 'argv' 建议将主函数声明更改为:

int main( void )