【发布时间】:2021-03-14 14:05:16
【问题描述】:
请考虑以下程序代码
#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 运行
该程序似乎意外终止而没有打印输出。
但是,如果我删除了除exitCommand 之外的至少一个变量,或者不初始化除exitCommand 之外的变量,则程序运行正常。
我对导致此问题的原因感到困惑。堆栈内存不应该是一个问题,因为所有这些占用不到 1000000B。
我怀疑fgets() 可能是造成这种情况的原因,但没有可以参考的运行时错误。我是否应该为cmd char 数组分配显式空间?使用的编译器是TDM-GCC。请解释一下这个现象。
【问题讨论】:
-
cmd是一个未初始化的指针。 -
cmd需要是一个实际的数组,而不是未初始化的指针。 -
你能在你的编译器中调高警告级别吗?您正在使用
cmduninitialized 并且任何最近的编译器都应该抱怨这一点。使用随机内存地址来存储您的输入不是一个好主意。要么使用malloc保留一些内存,要么将cmd设为一个数组。 -
嗨,我可以使用什么编译器指令来提高警告级别?
-Werror工作吗? -
@mindoverflow 你可以使用
-Wall-Wextra-pedantic