0
int arr2[5]={5,4,3,2,1};
sortArray(arr2, 5);

void sortArray(int data[], int size)
{
    int i, j;
    int element;

    for (i = 1; i < size; i++)
    {
        element = data[i];
        j = i-1;

        while (j >= 0 && element < data[j])
        {
            data[j+1] = data[j];
            j--;
        }

        data[j] = element;
    }
}

関数が終了すると、関数でこのエラーが発生し、配列は{5,5,5,5,5}のようになります。なぜですか?

4

1 に答える 1

1

上記のように、forループの最初の反復中に、whileループが実行された後、jは-1にデクリメントされ、データ配列のインデックスとして使用されます。これがスタックの破損の原因です。

スタックの破損に関する詳細情報:配列の特定のインデックス(IE data [j])を参照する場合、基本的には「data」という名前のポインターが指すメモリ内の場所から開始し、j * sizeof(int )バイト、およびその値を取得します。

コードでdata[j]は、はと同等*(data + (j * sizeof(int)))です。負の値を指定すると、データ配列に割り当てられていないメモリを参照します。この場合、メモリはたまたまスタックの一部です。変更しているため、スタック破損エラーが発生します。

于 2012-12-14T00:08:29.157 に答える