C++中的大数组崩溃

Crash on big array in C++

本文关键字:数组 崩溃 C++      更新时间:2023-10-16

我正在开发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。看起来它到达了一个边界什么的。

我不确定。这可能是因为我更改了项目属性中的某些选项。

首先,您应该将返回的指针mallocNULL进行比较,否则您不知道分配是否成功。

其次,您的索引是错误的: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);