2012-04-29 6 views
1

私は反復的にマージソートを実装するC++プログラムを作成しています。メインコードが以下に示されていますが、別のプログラムで同じ方法でさらに多くのメモリ(1 GB)を割り当てたにもかかわらず、「アクセス違反書き込み場所0xXXXXXXXX」エラーが発生する理由を理解できません。アクセス違反の書き込み場所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"); 
} 
+5

'new int(size)'ではなく、 'new int [size]'を使用します。後者はそれを作成し、それを 'size'に初期化します。また、http://www2.research.att.com/~bs/bs_bsq2.html#void-main – chris

+2

'void main()'?あなたはどんな本を使っていますか? – Flexo

+0

ありがとうございました... – Nashwan

答えて

7

あなたは1つの整数のために十分なだけのメモリを割り当ててみてください。new int(size)sizeとして割り当てます。だからあなたは、1GBのメモリを指していません。 1の整数を超えてアクセスすると、アクセス違反が発生する可能性がある未定義の動作です。

new int(size)を角括弧[new int[size]]に変更してください。

また、さらにstd::vector<int>を使用してください。

+0

実際、ベクターは素晴らしいです。 – chris

+0

はい。私はベクトルも好きで、毎日使っています – Matchman

2

割り当てコードにわずかな誤字があります。このライン

int* a =  new int(size); 

sizeと単一intを生成します。

が、これは代わりに

int* a =  new int[size]; 
関連する問題