2016-10-22 5 views
0

こんにちは私はこのMaximum size of local array variableを見たことがありますが、アレイがグローバルに設定されていて、メインの後に来るとOKではないのはなぜか分かりません。ローカル配列変数exc不正アクセスのセグメンテーション&ローカルまたはグローバル?

さらにもう1つの質問: a.cppで定義され、externでa.hppで宣言された大きなメモリオブジェクトを持つことをお勧めしますか?または、ローカルメモリで定義された大容量のメモリを使用する方が良いでしょうが、ベクタまたは新規またはmallocとして定義され、それらを関数引数で渡します。

それは私が解決する必要がそれらの質問です私の経験を参照してくださいです...

はあなたが

#include <iostream> 
using namespace std; 

#define N (10000000000000) 
int sd[N]; 

int main() { 
    // int sd[N]; 
    return 0; 
} 
+0

あなたが非常に大きいまたは未知のサイズの配列を持っている場合、あなたはヒープを利用したいと思います。 – amanuel2

+2

'std:vector 'を代わりに使用してください。 –

+0

ルーチンのローカル変数はスタックに割り当てられますが、これは比較的小さいと予想されます。グローバル変数(過度の単純化)はヒープ上に割り当てられます。これはデフォルトでははるかに大きな領域です。あなたの変数は、new()やmalloc()を使ってローカルルーチン内のヒープスペースを使って割り当てることもできますが、関数が終了するとそれらの変数を参照するポインタが範囲外になり、メモリリークが発生しますdelete()またはfree()を使用してメモリの割り当てを解除します。 – mikeTronix

答えて

0

グローバルスコープで宣言ありがとう:

int sd[N]; 

int main() { 
    return 0; 
} 

そして、結果のバイナリだけを取得します本当の大きな。プロセスがメモリにロードされると、グローバルメモリデータのセット全体はにマッピングされ

が関数内で宣言:

int main() { 
    int sd[N]; 
    return 0; 
} 

そして、呼び出されたように、メモリが機能するとすぐに割り当てられている - そして、それはです。スタックからが割り当てられました。スレッドのためのスタックメモリは、通常、メガバイト以下に低く初期化されます。スタックメモリがなくなると、ゲームが終了します。

他の人がコメントで指摘したように、LARGE配列を割り当てる正しい方法は、通常は豊富なヒープメモリを使用して動的に行われます。

さらに良い
int main() { 
    int* sd = new int[N]; 

    ... 

    delete [] sd; // free the allocated memory 
    return 0; 
} 

、削除を覚えておく必要はありませんので:

int main() { 
    std::vector<int> sd(N); 

    ... 

} 
+0

http://stackoverflow.com/questions/40202324/c-vector-appear -c-array-than-be-c-array-time-なぜ – user7058377

+0

ベクトルがc配列よりも高速なのはなぜですか? – user7058377

+0

@ user7058377:コンテナが遅くも高速でもありません。個々の操作は遅いか高速です。そして、スピードが気になるのは、あなたが実際に*経験したことがあれば、何かが遅すぎるということです。これまでは、正しいツールを使用していました。 'std :: vector 'は、確かに正しいツールです。 –

関連する問題