-3

有人能告诉我为什么我会得到 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;
}

当我运行它时会出现段错误。

unix>strlen_ex
Enter a sentence: foo bar burr
Segmentation fault
4

1 回答 1

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堆栈帧)。然后它真的会出现段错误(或无论如何都会失败)。

于 2013-08-08T12:36:20.000 回答