3

重複の可能性:
Cプログラミング、なぜこの大きな配列宣言がセグメンテーション違反を引き起こすのですか?

c言語で画像を読んでいますが、プログラムが途中で停止しているため、読み取ることができません...デバッグ後、配列サイズが原因であることがわかりました...配列の最大サイズに制限はありますか?サイズ1400X1400の配列を宣言するとすべて正常に動作しますが、サイズ1600X1400の配列を定義すると、プログラムが動作を停止します...なぜそうなるのですか...コンパイラまたはOSによって配列サイズに制限がありますか?もしそうなら、cでこれに対する解決策は何ですか。

    unsigned char idata[1400][1400]; //working fine
    unsigned char idata[1600][1400]; //not working
4

4 に答える 4

8

idataそれはローカル変数だと思います。問題は、ローカル変数がスタックに格納され(技術的には「自動ストレージ」)、スタックが割り当てようとしている6400メガバイトよりもはるかに小さいことです。その量のストレージを割り当てると、スタックオーバーフローが発生します。

試す

unsigned char** idata = new unsigned char*[DIM1];

for (int i = 0; i < DIM1; ++i)
    idata[i] = new unsigned char[DIM2];

// or

unsigned char (*idata)[DIM2] = new char[DIM1][DIM2];

フリーストアに割り当てると問題ありません。

編集:

タグを見ただけで、Cについて話しているだけではわかりませんでした。もしそうなら、同じことをすることができますが、malloc代わりに使用することができますnew

unsigned char** idata = malloc(sizeof(unsigned char*) * DIM1);

for (i = 0; i < DIM1; ++i)
    idata[i] = malloc(DIM2);

// or

unsigned char (*idata)[DIM2] = malloc(DIM1 * DIM2);

また、メモリリークを回避するために、割り当てるメモリfree(またはC ++の場合)を忘れないでください。delete[]

于 2012-09-23T14:04:58.577 に答える
2

Cのフリーストアで2Dアレイを割り当てて解放する方法は次のとおりです。

unsigned char (*idata)[1400] = malloc(1600 * 1400);
// ...
free(idata);
于 2012-09-23T14:12:19.627 に答える
2

これをスタックで宣言すると(たとえば、いくつかの関数で)、はい、スタックオーバーフローを提供します。

静的(「グローバル変数」)として宣言することも、動的にメモリを割り当てることもできます。

行の長さが異なる多次元配列の割り当てにmallocを使用すること は、ほとんど問題です。

于 2012-09-23T14:05:29.823 に答える
0

のような式を使用するunsigned char idata[sz1][sz2]と、配列のスペースはスタックに割り当てられますが、スタックのスペースはどういうわけか非常に小さいため、問題が発生します。

ただし、unsignedを使用する場合char* idata = new char*[sz]、必要なスペースはヒープに割り当てられます。通常、あなたはあなたが望むスペースを得ることができます。

于 2012-09-23T14:08:43.950 に答える