在C ++中崩溃大数组

时间:2015-11-12 07:30:09

标签: 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];
    }
}

该程序也可以构建。这一次,它在运行&#34; for&#34;时崩溃了。循环。

停在PixVectIn[a*800+b].x=PixVect[a][b][0];。它显示了相同的错误代码,此时a = 600和b = 252。看起来它达到了界限。

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

3 个答案:

答案 0 :(得分:2)

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

其次你的指数是错误的:PixVectIn[a*800+b]将超出480000的界限,因为你的a单独上升到800,而800 ^ 2是> 480000.也许你的意思是a*b

答案 1 :(得分:1)

增加堆栈大小或将该数组声明为静态或将其置于全局范围内。您的堆栈(在您的情况下)不够大,无法处理1920000字节......

答案 2 :(得分:1)

第一个程序被堆栈溢出咬了。

对于第二个,a*800+b是799,800*800 + 600 > 480000等值的访问冲突。

还可以更好地替换它:

cl_float4 *PixVectIn=(cl_float4*)malloc(480000*sizeof(cl_float4));

用这个:

std::vector<cl_float4> PixVectIn(480000);