堆栈溢出 C++

发布于 2024-11-13 05:50:57 字数 768 浏览 5 评论 0原文

这是我的代码。当我在 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;
}

This is my code. When I access dtr array in initImg function it gives a stack overflow exception. What might be the reason?

#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;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

风透绣罗衣 2024-11-20 05:50:57

这:

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

This:

int image[W*H];
float dtr[W*H];

Creates each a 4 * 1000 * 1000 ~ 4 MB array into the stack. The stack space is limited, and usually it's less than 4 MB. Don't do that, create the arrays in the heap using new.

int *image = new int[W*H];
float *dtr = new float[W*H];
沫雨熙 2024-11-20 05:50:57

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

Your stack probably isn't big enough to hold a million ints and a million floats (8MB). So as soon as you try to access beyond your stack size, your operating system throws you an error. Objects or arrays above a certain size need to be allocated on the heap - preferably using a self-managing self-bounds-checking class such as std::vector - the specific size depends on your implementation.

今天小雨转甜 2024-11-20 05:50:57

除了堆栈溢出之外,您还有另一个问题 - 一个被 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 你会超出你的缓冲区。

您的代码示例中的其他地方也存在同样的问题。

In addition to the stack overrun, you have another problem -- one which is masked by your definitions of W and 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
    }

Your i loop should count from 0 to H-1, rather than W-1 (and the j loop should swap as well). Otherwise your code will only work correctly if W==H. If WH you will overrun your buffers.

This same problem exists elsewhere in your code sample as well.

上课铃就是安魂曲 2024-11-20 05:50:57

您正在堆栈上创建巨大的数组。只需使用 std::vector 即可:

std::vector<int> image(W*H);
std::vector<float> dtr(W*H);

You're creating giant arrays on the stack. Just use std::vector instead:

std::vector<int> image(W*H);
std::vector<float> dtr(W*H);
╭⌒浅淡时光〆 2024-11-20 05:50:57

你的堆栈已满。您可以在堆中分配内存或增加堆栈内存。据我所知,最大大小约为 8MB,但这不是一个好主意。最好的解决方案是使用堆分配或 std 中可用的一些容器(向量)。

Your stack is full. You can allocate memory in heap or increase the stack memory. From what I know the maximum size is about 8MB, but this is not a very good idea. The best solution is to use heap allocation or some containers (vector) available in std.

桃扇骨 2024-11-20 05:50:57

您最终会得到

dtr[W*W+j] = 0;   <------here

比您分配的要多得多的结果。

You will eventually get to

dtr[W*W+j] = 0;   <------here

Which is much more than you have allocated.

溺ぐ爱和你が 2024-11-20 05:50:57

您的编译器将定义堆栈大小。解决这个问题的一种方法是使用 std::vector array_one(W*H) 动态分配数组。

Your compiler will define the stack size. A way to get around this is to dynamically allocate your arrays using std::vector array_one(W*H).

奶气 2024-11-20 05:50:57

您正在尝试从堆栈分配内存。使用堆栈可以分配的最大内存取决于编译器。
所以尝试这样的事情来避免这种异常。

#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 从堆中分配内存...

You are trying to allocate memory from stack. the maximum memory which can be allocated using stack is complier dependent.
So try something like this to avoid this kind of exception.

#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; 
}

You can use new as well instead of using malloc to allocate memory from heap...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文