在下面的代码(源代码的简化版本)中,变量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

10-08 03:56