1

マージソートを繰り返し実装するC++プログラムを書いています。メインコードを以下に示します。別のプログラムで同じ方法ではるかに多くのメモリ(1 GB)を割り当てたにもかかわらず、「アクセス違反の書き込み場所0xXXXXXXXX」エラーが発生する理由を理解できません。

void main()
{
    //int a[size];
    int* a =  new int(size); //initialising an int array dynamically contains 16777216 el
    srand(time(NULL));
    for(int i = 0 ; i < size; i++)
    {
        a[i]= 1 + rand() % 10;
    }

    for(int i = 0;  (size / 2) / pow((double)2, i)>= 1; i++)
    {
        int n = pow((double)2, i);
        int offset = 0;
        for(int j = 0; j < (size / 2) / pow((double)2, i); j++)
        {
            int* tmp = new int(n);
            merge(a + offset, n, a + offset + n, n, tmp);
            memcpy(a + offset, tmp, n*2 * sizeof(int));
            offset += pow((double)2, i+1);
        }
    }

    for(int i = 0; i < size; i++)
    {
        cout<<a[i]<<" ";
        //printf("%d ", a[i]);
    }
    cout<<endl;
    system("PAUSE");
}
4

2 に答える 2

7

1 つの integer:new int(size)に十分なメモリのみを割り当て、それを として割り当てますsize。したがって、a が指す 1GB のメモリがありません。1 つの整数を超えてアクセスすると未定義の動作となり、アクセス違反が発生する可能性があります。

new int(size)角かっこに変更: new int[size].

さらに良いことに、を使用しstd::vector<int>ます。

于 2012-04-29T15:42:16.743 に答える
2

割り当てコードのわずかなタイプミス。この行

int* a =  new int(size);

の値を持つシングルintを作成します。size

代わりにこれを試してください

int* a =  new int[size];
于 2012-04-29T15:41:32.953 に答える