C++中的大数组崩溃
Crash on big array in C++
我正在开发OpenCL,我在MS VS 2012:中编写了这样的代码
cl_float test[480000];
它可以成功编译,但当程序进入上述代码所在的功能时会崩溃。错误代码:0xC000041D。
它在接近文件"chkstk.asm"结尾时中断:
; Find next lower page and probe
cs20:
sub eax, _PAGESIZE_ ; decrease by PAGESIZE
test dword ptr [eax],eax ; probe page.
jmp short cs10
_chkstk endp
end
在线路test dword ptr [eax],eax ; probe page.
。
我不认为这个数组太大而无法分配。
所以接下来,我想尝试另一种方式:
cl_float4 *PixVectIn=(cl_float4*)malloc(480000*sizeof(cl_float4));
for(unsigned int a=0;a<800;a++){
for(unsigned int b=0;b<600;b++){
PixVectIn[a*800+b].x=PixVect[a][b][0];
PixVectIn[a*800+b].y=PixVect[a][b][1];
PixVectIn[a*800+b].z=PixVect[a][b][2];
}
}
程序也可以构建。这一次,它在运行"for"循环时崩溃。
它在PixVectIn[a*800+b].x=PixVect[a][b][0];
处停止。它向我显示了相同的错误代码,此时a=600,b=252。看起来它到达了一个边界什么的。
我不确定。这可能是因为我更改了项目属性中的某些选项。
首先,您应该将返回的指针malloc
与NULL
进行比较,否则您不知道分配是否成功。
其次,您的索引是错误的:PixVectIn[a*800+b]
将超出480000的范围,因为仅a
一项就上升到800,而800^2则>480000。也许你的意思是a*b
?
增加堆栈大小或将该数组声明为静态数组或将其置于全局范围中。您的堆栈(在您的情况下)不够大,无法处理1920000字节。。。
第一个程序被堆栈溢出所占用。
对于第二个值,a*800+b
是799、800*800 + 600 > 480000
等值的访问违规。
也更好地取代这个:
cl_float4 *PixVectIn=(cl_float4*)malloc(480000*sizeof(cl_float4));
这个:
std::vector<cl_float4> PixVectIn(480000);
相关文章:
- 类对象数组的问题会导致崩溃
- 字节数组初始化会导致 DirectX 崩溃
- 使用 sf::Text 数组时崩溃
- For 循环在尝试读取数组 c++ 时程序崩溃
- 删除数组 c++ 崩溃问题
- 如果类的成员,C++数组会导致崩溃
- 在C++中删除指针数组时析构函数崩溃
- 在 C++ 中使用平展数组语法,崩溃取决于宽度/高度
- 我的单例中的数组在离开函数后没有保留信息,然后在尝试再次访问信息时崩溃
- C++ rezing 动态数组最多可以处理一定数量的元素,但在某些时候会崩溃并显示错误 (0XC0000005)
- 释放字符的动态数组时崩溃
- size_t结构非数组成员崩溃的强制转换
- C++程序在迭代到数组的最后一个元素时崩溃
- 从数组比较2个字符串时,程序崩溃
- C++ 尝试向类内的数组(或向量)添加值时程序崩溃
- 内存相关崩溃:Cocos2d游戏中的三维数组
- 指针数组C++崩溃
- 超过120000个元素的数组崩溃
- c++ delete数组崩溃
- 使用2D c风格的数组崩溃