2012-06-02 25 views
0

嘿所有我只想爲什麼我每次嘗試初始化一個512x512陣列時都會收到堆棧溢出錯誤?誰能幫忙?下面是我的代碼的一部分無法初始化一個512x512陣列

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

    int ImgArray [512][512]; 

基本上我想要做的就是從圖像中獲取像素值並將其存儲到此數組中。圖像是512x512,因此數組大小。

希望聽到你的答案,謝謝!

+3

哪些你有什麼問題? –

+0

要麼你正在一臺內存非常有限的機器上工作(不太可能),要麼是你的代碼中有其他地方的問題。 'int ImgArray [512] [512];'在我的系統上編譯得很好。你得到的錯誤究竟是什麼? – Moritz

+0

有可能在堆棧上已經有相當一部分,它要求超過1MB的堆棧空間,相當多的實現會被阻塞。 – Flexo

回答

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; 
+0

或者使用'std :: vector' /某個容器,或者只使用像素。 – Flexo

0

通常,在32位操作系統,每個線程的堆棧具有默認大小4K。

所以你陣列比它大。你可以做

  1. 將數組定義爲全局或靜態變量,這些變量不是以堆棧形式分配的。

  2. 使用新/ malloc的就堆上分配

+1

對於linux,它是8MB –

+0

@ tim-oleksii是的,它不是限制。謝謝 – RolandXu

0

答案取決於你使用的是什麼平臺。例如,Microsoft Visual Studio默認使用1MB堆棧大小。您可以使用/ STACK鏈接器選項將應用程序的默認堆棧大小更改爲 。

在Linux上它有點不同,可能是this may help you

但我認爲使用動態內存分配更適合您的情況。

ImgArray** arr = new ImgArray* [512]; 
for(int i =0; i< 512; i++) arr[i] = new ImgArray[512]; 
0

其他的答案顯示方式不能對堆棧分配用於在2-d陣列的圖像存儲器,但通常與圖像時,最好用1-d陣列和索引直接工作如:

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; 

這些都是簡單的整數操作,通過這樣做,您將只有一個連續的內存塊來擔心每個圖像。你可以讓像std::vector這樣的東西以一種乾淨安全的RAII方式管理你的內存。

1

我看到兩個尚未提及的解決方案。你可以使用內存靜態存儲時間:

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>); 

的語法看起來少了很多令人費解的,如果你寫a little helper function

auto p = make_unique<std::array<std::array<int, 512>, 512>>();