-1
    #include
    int main(void)
    {
        char str[100]="88888888888888";
        char t[20]="";
        gets(t);
        puts(str);
        puts(t);
        return 0;
    }

ここに画像の説明を入力

最初の行

555555555555555555555555555555555

入れられます。

なぜstrですか55555555555?またはstrではないのはなぜですか?8888888888888888855555555555588888

4

4 に答える 4

6

バッファーをオーバーライドし、残りの入力と null ターミネーターが設定されているバッファーにt到達しました。null ターミネータまでのみ出力しますstrputs

ほとんどそのように見えます:

[ t (20)             ][str(100)                                 ]
 55555555555555555555  5555555555555\0

tは として宣言されchar[20]ていますが、出力すると完全な入力 (20 より長い) が得られることに注意してくださいputs

ところで、これはスタック オーバーフローではなくバッファ オーバーフローですが、このコードでもスタック オーバーフローが発生する可能性があります。

于 2012-04-14T15:45:27.133 に答える
1

Binyamin が言ったように、入力文字列が長すぎるためにトリガーされるオーバーフローが原因です。ただし、これは少しランダムなことです。2 つのメモリ割り当てが隣り合って発生し、文字列が隣接する変数に拡張される場合もあれば、発生しない場合もあります。

このようなオーバーフローにはガード条件を設定することをお勧めします。

gets ドキュメントに表示されている場合:

get は、fgets が引数として stdin を使用した場合とまったく同じように動作しないことに注意してください。まず、最後の改行文字は gets には含まれていませんが、fgets には含まれています。次に、gets では読み取る文字数の制限を指定できないため、str が指す配列のサイズに注意して、バッファー オーバーフローを回避する必要があります。

あなたの場合、サイズのアプリオリがわからない場合fgetsは、より安全であるため(少し遅いですが)使用することをお勧めします。

于 2012-04-14T15:47:50.883 に答える
1

520秒を超える文字列を入力すると、 に割り当てられたバッファをオーバーランし、 に割り当てられtたバッファに拡張されstrます。

次に、str入力した文字列である の内容を 21 文字目から表示します。

最後に、 の内容を表示しますが、その文字列はヌル文字で終わっていないため、すべてのs の後にヌル文字に遭遇するまでt、メモリ ( に割り当てられたバッファー) を表示し続けます。str5

于 2012-04-14T15:48:08.337 に答える
0

これらの割り当ての重複の問題を回避するために、この代替手段を試すことができます。これにより、私が間違っていなければ、実行時に割り当てが行われます。

    #include <iostream>

    int main(void)
    {
      char *str;
      char *t;
      str = new char(100);
      str = (char*)"88888888888888";
      t = new char(20);
      std::cin >> t;
      puts(str);
      puts(t);
      return 0;
    }
于 2012-04-14T16:22:38.273 に答える