我的strlen代码段错误

时间:2013-08-08 12:02:48

标签: c segmentation-fault strlen

有人可以告诉我为什么我会收到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

1 个答案:

答案 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堆栈帧)。然后它真的会发生段错(或者无论如何都会失败)。