fgets() 和初始化变量的奇怪程序行为

Odd program behavior with fgets() and initialized variables

请考虑以下程序代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(void)
{
    char *cmd;
    int exitCommand = 1;
    int validCommands = 0;
    int commandValid = 0;

    while(exitCommand != 0)
    {
        printf("> ");
        fgets(cmd, 101, stdin);
        if(*cmd != '\n')
        {
            printf("%s\n", cmd);
        }
        exitCommand = strncmp("exit", cmd, 4);
    }
    return 0;
}

我正在通过 gcc -o cmmd cmmd.c 在 Windows 10 x64 cmd 中编译此程序,然后通过 cmmd 运行ning 该程序似乎在没有打印输出的情况下意外终止。 但是,如果我至少删除 exitCommand 以外的变量之一,或者不初始化 exitCommand 以外的变量,程序将正常运行。 我对导致此问题的原因感到困惑。堆栈内存应该不是问题,因为所有这些占用不到 1000000B。 我怀疑 fgets() 可能是导致此问题的原因,但我无法参考 运行 时间错误。我是否应该为 cmd 字符数组显式分配 space?使用的编译器是 TDM-GCC。请解释一下这个现象。

char* cmd 未初始化。为了能够存储输入,您必须使 cmd 指向有效数组的地址:

char cmd[100];
fgets(cmd, 100, stdin);
// here you can use cmd as a null terminated string

您还应该检查 fgets return 值以检测任何错误。