这是我的代码。当我在initImg函数中访问dtr数组时,它会产生堆栈溢出异常。可能是什么原因?
#define W 1000
#define H 1000
#define MAX 100000
void initImg(int img[], float dtr[])
{
for(int i=0;i<W;i++)
for(int j=0;j<H;j++)
img[i*W+j]=255;
for(int j=0;j<H;j++)
{
img[j] = 0;
img[W*(W-1)+j] = 0;
}
for(int i=0;i<W;i++)
{
img[i*W] = 0;
img[i*W+H-1] = 0;
}
for(int i=0;i<W;i++)
for(int j=0;j<H;j++)
{
if(img[i*W+j]==0)
dtr[i*W+j] = 0; // <------here
else
dtr[i*W+j] = MAX; // <------here
}
}
int main()
{
int image[W*H];
float dtr[W*H];
initImg(image,dtr);
return 0;
}
答案 0 :(得分:16)
此:
int image[W*H];
float dtr[W*H];
将每个4 * 1000 * 1000~4 MB的数组创建到堆栈中。堆栈空间有限,通常小于4 MB。不要这样做,使用new在堆中创建数组。
int *image = new int[W*H];
float *dtr = new float[W*H];
答案 1 :(得分:10)
你的筹码可能不足以容纳一百万英镑和一百万个花车(8MB)。因此,只要您尝试访问超出堆栈大小,操作系统就会抛出错误。需要在堆上分配超过特定大小的对象或数组 - 最好使用自我管理的自我边界检查类,例如std::vector
- 具体大小取决于您的实现。
答案 2 :(得分:3)
除了堆栈溢出之外,还有另一个问题 - 一个被W和H的定义掩盖的问题。
for(int i=0;i<W;i++)
for(int j=0;j<H;j++)
{
if(img[i*W+j]==0)
dtr[i*W+j] = 0; // <------here
else
dtr[i*W+j] = MAX; // <------here
}
你的i循环应该从0到H-1,而不是W-1(并且j循环也应该交换)。否则,如果W == H,您的代码将只能正常工作。如果WH你将超出你的缓冲区。
同样的问题也存在于代码示例的其他地方。
答案 3 :(得分:3)
你的筹码已满。您可以在堆中分配内存或增加堆栈内存。据我所知,最大大小约为8MB,但这不是一个好主意。最好的解决方案是使用堆分配或std中可用的一些容器(向量)。
答案 4 :(得分:2)
您正在堆栈上创建巨型数组。只需使用std::vector
代替:
std::vector<int> image(W*H);
std::vector<float> dtr(W*H);
答案 5 :(得分:0)
你最终会到达
dtr[W*W+j] = 0; <------here
这比你分配的要多得多。
答案 6 :(得分:0)
您的编译器将定义堆栈大小。解决这个问题的方法是使用std :: vector array_one(W * H)动态分配数组。
答案 7 :(得分:-3)
您正在尝试从堆栈中分配内存。可以使用堆栈分配的最大内存取决于编译器。 所以尝试这样的事情来避免这种异常。
#include <stdlib.h>
#define W 1000
#define H 1000
#define MAX 100000
void initImg(int img[], float dtr[])
{
for(int i=0;i<W;i++)
for(int j=0;j<H;j++)
img[i*W+j]=255;
for(int j=0;j<H;j++)
{
img[j] = 0;
img[W*(W-1)+j] = 0;
}
for(int i=0;i<W;i++)
{
img[i*W] = 0;
img[i*W+H-1] = 0;
}
for(int i=0;i<W;i++)
for(int j=0;j<H;j++)
{
if(img[i*W+j]==0)
dtr[i*W+j] = 0; // <------here
else
dtr[i*W+j] = MAX; // <------here
}
}
int main()
{
int *image = (int*)malloc(4*W*H); //Malloc the memory....(Allocated from Heap..)
float *dtr = (float*)malloc(4*W*H);
if(image && dtr) //If none of the ptr is NULL. Means memory is allocated...
{
initImg(image,dtr);
}
return 0;
}
您也可以使用new而不是使用malloc从堆中分配内存...