0

C の文字配列に関して疑問があります。サイズ 1 の文字配列があります。論理的には、2 文字を超える文字を入力すると、セグメンテーション違反が発生するはずですがputs、配列を適切にprintf出力するのに対し、ガベージ値と一緒の配列、なぜこれが起こっているのですか

#include<stdio.h>
int main()
{
int i;
char A[1];
printf("%d\n",(int)sizeof(A));
gets(A);
puts(A);
for(i=0;i<8;i++)
{
printf("%c\n",A[i]);
}
}

O/P:

1
abcdefg
abcdefg
a




f
g

これに加えてarray size、プログラムに の複数の文字を入力して、セグメンテーション フォールトをスローする必要があります。スタック内の SFP が原因ですか? SFP のサイズは 4 バイトです 間違っていたら訂正してください

1
abcdefghijklmnop
abcdefghijklmnop
a




f
g
h
Segmentation fault
4

2 に答える 2

0

わかりました、他の人は高級言語と長老の経験でそれを説明しました。

アセンブリ層での状況を説明したいと思います。

最初の状況がなぜ事故なく実行されたか知っていますか?

バッファのオーバーフローは他のプロセスのメモリを破壊しないため、OS はプロセスにセグメンテーション違反を通知しません。

また、スタックの長さが配列のサイズよりも大きいのはなぜですか?

整列だから。多くの OS は、効率的なアドレッシングを実装するために、x バイトを整列するスタック フレームを必要とします。

x はマシンに依存します。

例: x が 16 バイトの場合。

char s[1] will lead the stack to 16 byte; 
char s[17] will lead the stack to 32byte.
于 2013-10-20T06:28:24.933 に答える
0
  1. 実際には、1 文字だけを書き込んだ場合でもgets()、配列に null 文字が書き込まれるため、バッファ オーバーフローが発生します。
  2. バッファ オーバーフローは、必ずしもセグメンテーション違反を意味するわけではありません。未定義の動作に頼ることはできません。おそらく、プログラムが書き込むべきではないメモリを壊すのに数回かかったのでしょう。

危険で避けるべきことをご存知のようですがgets()、念のため追記しました。

于 2013-10-20T03:01:03.720 に答える