-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 に答える