-3

2 つの配列を一緒に追加しようとしています。{0, 1, 2}2 番目の配列に追加されたときの最初の配列は、{3, 4, 5}を生成する必要があり{0, 1, 2, 3, 4, 5}ます。先に進む前に、私が持っているものをお見せしましょう。

#include <iostream>

int main() {

    int i = 0;

    int arr1[] = {3, 4, 5}, arr2[] = {0, 1, 2};

    while (i < 3) {
        arr2[3 + i] = arr1[i];
        i++;
    }

    std::cout << std::endl;

    for (int i = 0; i < 6; i++) std::cout << arr2[i] << std::endl; // print

}

私がそれを実装した方法は正しいと思います。しかし、新しい配列 ( arr2) の内容を出力すると、次のようになります。

0
1
2
-1219315227
-1218166796
134514640

0, 1, 2は元の配列ですが、3, 4, 5一部がこれらの奇妙な数値に変換されています。std::coutただし、これはwhile ループに任意のステートメントを追加することで何とか修正されます。

...
while (i < 3) {
    std::cout << 5 << '\n'; // just a random #

    arr2[3 + i] = arr1[i];
    i++;
}
...

そして、配列をもう一度印刷すると、うまくいきます!:

5

0
1
2
3
4
5

私の質問は、while ループ内でステートメントを使用するstd::coutと、そうしないのではなく、なぜこれが機能するのかということです。その場合、それらの数値が得られます。

編集:

したがって、ここにあるのは未定義の動作であることがわかりました。それで、私の質問はまだ立っています: なぜ私のコードstd::coutは while ループ内の呼び出しで動作するのですか?

4

3 に答える 3

7

あなたはarr2ここの限界を超えています:

while (i < 3) {
    arr2[3 + i] = arr1[i];
    i++;
}

arr2サイズは 3 です。あなたがしているのは未定義の動作です。観測されたすべての動作は、未定義の動作と一致しています。

于 2012-12-11T19:59:56.587 に答える
1

2 番目の配列を次のように宣言すると、次のようになります。

arr2[] = {0, 1, 2};

サイズを 3 にしています。これらの範囲外に書き込むと、未定義の動作になります。

于 2012-12-11T20:00:09.733 に答える
0

ここにあるのは未定義動作です:

問題は、arr23つのアイテムにのみ割り当てられており、割り当てられたスペースの後に書き込みを行っていることです。

while (i < 3) {
    arr2[3 + i] = arr1[i];
    i++;
}

配列により多くのスペースを割り当てるか、ヒープに割り当てる必要があるため、realloc関数を使用してサイズを変更できます。または、さらに良いことに、C++っぽいものを使用できますstd::vector<int>

于 2012-12-11T20:02:06.667 に答える