6

次のプログラムを実行します。

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    char a[8] = "Hello, ";
    char b[7] = "world!";

    strcat(a, b);

    cout << a;

    return 0;
}

abは、割り当てられた文字列と同じサイズであることに注意してください。

ドキュメントには、 forstrcat(a, b)が機能aするには、連結された結果の文字列を含めるのに十分な大きさが必要であると記載されています。

それにもかかわらず、cout << a表示されます"Hello, world!"。未定義の動作に入っていますか?

4

5 に答える 5

3

未定義の動作に入っていますか?

はい。


ドキュメントに「連結された結果の文字列を含めるのに十分な大きさが必要aと書かれている場合、単にそれを信じてみませんか? 何を疑う必要がありますか?

于 2013-10-07T16:59:32.103 に答える
2

strcatTin Viz に書かれていることを実行します。どのデータが既に存在するかを気にせずに b を a の末尾にコピーします。両方の変数がスタック上にあるため、他のことが機能します。しかし、試してみてください

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    char a[8] = "Hello, ";
    int i =  10;
    char b[7] = "world!";

    strcat(a, b);

    cout << a << i;

return 0;
}

また、スタックが破損しているため、予期しない結果が生じる可能性があります。strcat

于 2013-10-07T17:06:05.703 に答える
2

あなたのプログラムでは、配列aが結果を格納するのに十分な大きさではありません。したがって、コードが間違っているため、修正する必要があります。標準の言葉では、実際に未定義の動作を入力しています。つまり、機能する場合と機能しない場合があります...

于 2013-10-07T17:01:02.100 に答える
1

その通りです....動作は未定義です。aその答えが得られたからといって、配列が小さすぎるために次回はクラッシュしないとは限りません。

于 2013-10-07T17:00:21.380 に答える