0

512x512 配列を初期化しようとすると、スタック オーバーフロー エラーが発生し続けるのはなぜですか? 誰でも助けることができますか?以下は私のコードの一部です

CImg<float> image("lena8bit.jpg"); 
CImgDisplay main_disp(image,"Main image");

    int ImgArray [512][512];

基本的にやりたいことは、画像からピクセル値を取得して、この配列に格納することだけです。画像は 512x512 なので配列サイズです。

回答をお待ちしております。ありがとうございます。

4

5 に答える 5

5

配列が大きすぎてスタックに割り当てられません。

ヒープに割り当てる必要がありますnew[](および割り当て解除に使用delete[]します)。

したがって、次のように配列を作成できます。

// Create the array
int ** myArray = new int*[512];
for(int i=0; i<512; i++)
    myArray[i] = new int [512];

myArray[12][64] = 52; // Work with the array as you like

// Destroy the array
for(int i = 0 ; i < 512 ; i++ )
    delete [] myArray[i];
delete [] myArray;
于 2012-06-02T09:27:05.773 に答える
1

まだ言及されていない2つの解決策があります。静的ストレージ期間でメモリを使用できます。

static int ImgArray [512][512];

として宣言されている場合、配列はプログラム全体にわたって存続することに注意してくださいstatic。これは、異なるスレッドから関数を複数回呼び出す予定がある場合、または関数が再帰的である場合に問題になる可能性があります。

または、ヒープから配列を割り当て、一意のポインターで寿命を管理することもできます。

std::unique_ptr<std::array<std::array<int, 512>, 512>> p
           (new std::array<std::array<int, 512>, 512>);

少しヘルパー関数を書くと、構文はそれほど複雑ではないように見えます。

auto p = make_unique<std::array<std::array<int, 512>, 512>>();
于 2012-06-02T13:03:40.450 に答える
0

他の回答は、スタック上にない2D配列の画像にメモリを割り当てる方法を示していますが、通常、画像を操作する場合は、1D配列を操作して、それに直接インデックスを付けることをお勧めします。

const int width=512, height=512;
std::vector<int> pixels(height*width);

次に、特定の座標でピクセルを見つけることができます。

// Find an x and y position:
int x=12, y=12;
int &px = pixels.at((y*width) + x);

または、特定のピクセルの座標を見つけます。

// Find the x and y values of pixel 100;
int idx = 100;
x = idx % width;
y = idx / width;

これらはすべて単純な整数演算であり、このようにすることで、画像ごとに心配するメモリの連続したブロックが1つだけになります。std::vectorクリーンで安全なRAIIの方法で、そのメモリを管理するようなものを作成できます。

于 2012-06-02T10:37:09.423 に答える
0

通常、32 ビット OS では、各スレッドのスタックのデフォルト サイズは 4K です。

したがって、配列はそれよりも大きくなります。できるよ

  1. スタックに割り当てられていないグローバル変数または静的変数として配列を定義します。

  2. new/malloc を使用してヒープに割り当てます

于 2012-06-02T09:36:30.170 に答える
0

答えは、使用しているプラ​​ットフォームによって異なります。たとえば、Microsoft Visual Studio はデフォルトで 1MB のスタック サイズを使用します。/STACK リンカー オプションを使用して、アプリケーションの既定のスタック サイズを変更できます。

Linux では少し異なります。おそらくこれが役立つでしょう

しかし、あなたの場合、動的メモリ割り当てを使用する方が適切だと思います。

ImgArray** arr = new ImgArray* [512];
for(int i =0; i< 512; i++) arr[i] = new ImgArray[512];
于 2012-06-02T09:38:27.367 に答える