堆栈溢出C++
Stack overflow 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;
}
这:
int image[W*H];
float dtr[W*H];
在堆栈中分别创建一个4*1000*1000~4 MB的阵列。堆栈空间有限,通常小于4MB。不要这样做,使用new在堆中创建数组。
int *image = new int[W*H];
float *dtr = new float[W*H];
您的堆栈可能不够大,无法容纳一百万个int和一百万个float(8MB)。因此,一旦您试图访问超出堆栈大小的内容,操作系统就会向您抛出一个错误。超过一定大小的对象或数组需要在堆上分配——最好使用自管理的自边界检查类(如std::vector
)——具体大小取决于您的实现。
除了堆栈溢出之外,还有另一个问题——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,您将超出缓冲区。
同样的问题也存在于代码示例的其他地方。
您正在堆栈上创建巨大的数组。只需使用std::vector
:
std::vector<int> image(W*H);
std::vector<float> dtr(W*H);
您的堆栈已满。您可以在堆中分配内存,也可以增加堆栈内存。据我所知,最大大小约为8MB,但这不是一个好主意。最好的解决方案是使用标准中可用的堆分配或一些容器(矢量)。
您最终将进入
dtr[W*W+j] = 0; <------here
这比你分配的要多得多。
编译器将定义堆栈大小。解决这个问题的一种方法是使用std::vector array_one(W*H)动态分配数组。
您正试图从堆栈中分配内存。使用堆栈可以分配的最大内存取决于编译器。所以尝试这样的方法来避免这种异常。
#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从堆中分配内存。。。
相关文章:
- 'short int'持有的值溢出,但"自动"不会溢出?
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 大于65535的C++数组[size]引发不一致的溢出
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- C++中无符号字符溢出
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 整数溢出,最大值为 pow(10,19)
- 获取隐式转换溢出从无符号到已签名的警告
- 使用 strcat 获取缓冲区溢出错误
- LeetCode 1:两和 - 地址清理器:堆缓冲区溢出地址
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- C++ 对象数组堆栈溢出
- 使用提升::lexical_cast捕获溢出
- C++ Unordered_set功能中的溢出
- 自定义排序函数中的堆溢出
- 使用向量的缓冲区溢出
- 有没有一种方法可以捕获进程中的堆栈溢出?C++Linux
- 如何修复此特征矩阵反演溢出错误?
- c++中栈溢出和分段错误的危险