嘿所有我想只是为什么每当我尝试初始化512x512阵列时我都会遇到堆栈溢出错误?有人可以帮忙吗?下面是我的代码的一部分
CImg<float> image("lena8bit.jpg");
CImgDisplay main_disp(image,"Main image");
int ImgArray [512][512];
基本上我想做的就是从图像中获取像素值并将其存储到此数组中。图像为512x512,因此是阵列大小。
希望听到你的回答,谢谢!
答案 0 :(得分: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;
答案 1 :(得分: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>);
,语法看起来就不那么复杂了
auto p = make_unique<std::array<std::array<int, 512>, 512>>();
答案 2 :(得分:0)
通常,在32位操作系统中,每个线程的堆栈都具有默认大小4K。
所以你的数组比它大。你可以做到
将数组定义为未在堆栈中分配的全局或静态变量。
使用new / malloc在堆上分配
答案 3 :(得分: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];
答案 4 :(得分:0)
其他答案已经显示了为不在堆栈上的二维数组中的图像分配内存的方法,但通常在处理图像时,最好使用一维数组并直接索引,例如:< / p>
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方式为您管理内存。