堆栈溢出 C++
这是我的代码。当我在 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
这:
在堆栈中创建每个 4 * 1000 * 1000 ~ 4 MB 的数组。堆栈空间有限,通常小于 4 MB。不要这样做,使用 new 在堆中创建数组。
This:
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.
您的堆栈可能不够大,无法容纳一百万个整数和一百万个浮点数 (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.除了堆栈溢出之外,您还有另一个问题 - 一个被 W 和 H 的定义所掩盖的问题。
您的 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.
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.
您正在堆栈上创建巨大的数组。只需使用
std::vector
即可:You're creating giant arrays on the stack. Just use
std::vector
instead:你的堆栈已满。您可以在堆中分配内存或增加堆栈内存。据我所知,最大大小约为 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.
您最终会得到
比您分配的要多得多的结果。
You will eventually get to
Which is much more than you have allocated.
您的编译器将定义堆栈大小。解决这个问题的一种方法是使用 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).
您正在尝试从堆栈分配内存。使用堆栈可以分配的最大内存取决于编译器。
所以尝试这样的事情来避免这种异常。
您也可以使用 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.
You can use new as well instead of using malloc to allocate memory from heap...