1

2つの配列を1つにマージしたいと思います。例:

  • A1 = 1,1
  • A2 = 2,2
  • 次にA3=1,2,1,2

例えば:

  • A1 = 1
  • A2 = 2,2,2,2
  • 次にA3=1,2,2,2,2

例えば:

  • A1 = 1,1,1,1
  • A2 = 2,2
  • 次にA3=1,2,1,2,1,1

最後の例では、コードを実行すると、1,2,1,2,1,20が得られました。

最後から2番目に、私は1,2,32767,2,2を取得しました。

だから私は間違ったコードを持っていると思います。短い配列の要素を取り終えた直後に、A3の残りすべてを長い方で埋めます。しかし、その理由がわかりませんでした—助けてくれませんか?

コード:

int *p3=arr3;   //arr3 is A3 for example, arr1 = A1..etc, all sizes are defined
int index;
int index1=0;
int index2=0;

for(index = 0; index< sizeofArr3 ; index++)
{
    if(index%2==0)
    {
        if(index1<=sizeofArr1)
            *(p3++) = arr1[index1++];
        else
            *(p3++) = arr2[index2++];
    }
    else 
    {
        if(index2<=sizeofArr2)
            *(p3++) = arr2[index2++];
        else
            *(p3++) = arr1[index1++];
    }
}
4

3 に答える 3

3

それはこの行です:

if (index1 <= sizeofArr1)

index2およびと同等のものsizeofArr2<ではなくを使用する必要があります<=

その理由は、Cのゼロベースの配列に関係しています。サイズの配列の場合N、要素インデックスは包括的です0。 要素( th要素)N-1へのアクセスを許可しているため、実際には未定義の動作を呼び出しています。NN+1

理論的には、実装はその場合、宇宙の破壊まで、そしてそれを含めて何でも行うことができます。少しひどい結果を出すことにしたのはラッキーだと思います:-)

于 2012-04-08T02:44:32.407 に答える
2

<= sizeOfArr1および2は実際には<sizeOfArr1および2である必要がありますか?サイズはどのように計算していますか?

于 2012-04-08T02:47:51.073 に答える
1

ループ内のテストは次のようになります。

if (index1 < sizeofArr1)

では<なく、を使用します。これは、配列内の有効な最大インデックスではなく、配列内の要素数のカウントであると<=想定しています。sizeofArr1配列が同じ長さの場合、この不一致は問題になりません(したがって、最初のシーケンスは問題ありませんでした)が、配列の長さが異なる場合は問題になります。

于 2012-04-08T02:47:45.417 に答える