堆栈溢出C++

use*_*593 7 c++ stack-overflow callstack exception

这是我的代码.当我在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;
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*gro 18

这个:

int image[W*H];
float dtr[W*H];
Run Code Online (Sandbox Code Playgroud)

在堆栈中创建每个4*1000*1000~4 MB的数组.堆栈空间有限,通常小于4 MB.不要这样做,使用new在堆中创建数组.

int *image = new int[W*H];
float *dtr = new float[W*H];
Run Code Online (Sandbox Code Playgroud)

  • 呃 - 使用`std :: vector`? (14认同)
  • @Simon:无论如何,你正在创建一个动态大小的数组,它恰好具有已知的大小.直接使用new将允许内存泄漏,并且对于越界访问等具有差/无调试支持.`std :: vector <int> image(W*H);`以更安全的方式执行相同的功能. (4认同)

Pup*_*ppy 10

您的堆栈可能不足以容纳一百万个整数和一百万个浮点数(8MB).因此,只要您尝试访问超出堆栈大小,操作系统就会抛出错误.需要在堆上分配超过特定大小的对象或数组 - 最好使用自我管理的自我边界检查类,例如std::vector- 具体大小取决于您的实现.