有人可以告诉我为什么我会收到这个信号吗?

#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

最佳答案

我看不到它会崩溃的任何原因,但是有潜在的...

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

关于c - 我奇怪的代码段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18125545/

10-11 16:41