-4

整数配列リストがあり、これにアクセスするために左右ポインター配列リストを作成したいと考えています。しかし、要素が 690.000 を超える場合 (たとえば 700.000)、プログラムは停止し、「セグメンテーション違反 (コア ダンプ)」と表示されます。以前に std::vector を使用したことがありますが、速度のために単純な配列リストを使用する必要があります。そして、このコードは私のプログラムに関するものではなく、コードの問題を伝える非常に簡単な方法です. このコードはクラスメソッドで実行されるため、グローバル変数を使用する必要があります。

int k=698900;


int n1=k/2;
int n2=k/2;
int *left[n1];
int *right[n2]; 
int list[k];

for(int i=0; i<k; i++){
    list[i] = i;
}

for(int i=0; i<n1; i++){
    left[i] = &list[i];
}

for(int i=0; i<n2; i++){
    right[i] = &list[i];
}

for(int i=0; i<n2; i++){
    cout << *right[i] << endl;
}
4

1 に答える 1

1

@PaulR がコメントで既に述べたように、問題はスタック オーバーフローです。この問題はいくつかの方法で解決できます。コードの変更に断固として反対する場合は、コンパイラでスタック サイズを調整できます。それがどのように正確に行われるかは、コンパイラによって異なります ( gcc の例およびVS の例)。実行時に調整することもできますが、これは OS に依存する機能であるため、詳細には触れません。

私が好む解決策は、ヒープにメモリを割り当てることです。これは、ヒープに配列を割り当てることで実行できますが、メモリが不要になったときint **left = new int*[n1];に呼び出すことを忘れないでください。delete []left;はるかに洗練された解決策は、std::vector代わりに a を使用することです。

これをすべての最適化をオンにしてコンパイルしてみてください。あなたのコードよりもかなり遅いということを教えてください。

int k=698900;


int n1=k/2;
int n2=k/2;
//not that I condone storing raw pointers in a vector
//admittedly this is a rather dangerous thing to do
//storing indices would be smarter because upon adding
//elements the memory could be relocated
std::vector<int *> left(n1);  
std::vector<int *> right(n2); 
std::vector<int> list(k);

for(int i=0; i<k; i++){
    list[i] = i;
}

for(int i=0; i<n1; i++){
    left[i] = &list[i];
}

for(int i=0; i<n2; i++){
    right[i] = &list[i];
}

for(int i=0; i<n2; i++){
    cout << *right[i] << endl;
}

@PaulRが述べたように、配列を静的に(static int *left[n1];)またはグローバルに(関数またはクラスの宣言/定義の外で)割り当てることもできます

于 2013-10-19T16:15:21.923 に答える