【发布时间】:2025-12-20 15:05:07
【问题描述】:
我似乎有一些与此类似的问题,但是我以一种非常直接的方式提问,所以希望我能很好地解释到底发生了什么。
看看这个非常简单的程序:
int main()
{
char* a;
a[200];
fgets(a, 200, stdin);
char* b;
b[200];
fgets(b, 200, stdin); // Seg fault occurs once I press enter
return 0;
};
如您所见,“a”部分运行良好。但是部分“b”段错误。怎么回事?
【问题讨论】:
-
a[200];导致undefined behaviour -
这并不神秘。没有学习基本的 C 是问题所在。
char* a; a[200];-->char a[200]和char* b; b[200];-->char b[200] -
@M.M 但是为什么它是未定义的行为?
-
@SanchkeDellowar:这是未定义的行为,因为变量
a是char *(这就是char *a;的含义)。指针没有初始化程序,因此指针的任何取消引用都会导致 UB(未定义的行为)。a[200];取消引用未初始化的指针;幸运的是,编译器可能会优化它。您需要char a[200];处于已定义行为的范围内(b也是如此)。对fgets()的调用同样是UB。不幸的是代码没有早点崩溃,但未定义的行为很有趣——任何事情都有可能发生,没关系! -
@SanchkeDellowar
a没有指向任何地方,所以你不能取消引用它(即查找它指向的内存)
标签: c segmentation-fault fgets