有人可以告诉我为什么我会收到sigsegv吗?
#include <stdio.h>
#include <string.h>
int main ()
{
char szInput[256];
printf ("Enter a sentence: ");
fgets (szInput, 256, stdin);
size_t n = (unsigned)strlen(szInput);
printf ("The sentence entered is %ld characters long.\n", n);
return 0;
}
当我运行segfaults时。
unix>strlen_ex
Enter a sentence: foo bar burr
Segmentation fault
答案 0 :(得分:0)
我认为没有理由让它崩溃,但有可能......
最好传递sizeof szInput
而不是显式256.这可以防止您在fgets
中意外获得错误的尺寸。
char szInput[256];
printf ("Enter a sentence: ");
fgets (szInput, sizeof szInput, stdin);
例如,如果将数组设置为8个字节,请将fgets
调用保留为256并输入“hello world”:
char szInput[8];
printf ("Enter a sentence: ");
fgets (szInput, 256, stdin);
然后fgets调用将写入超出szInput
的末尾。由于它在堆栈上,它可能会覆盖一些重要的东西(例如fgets
堆栈帧)。然后它真的会发生段错(或者无论如何都会失败)。