将新值分配给数组时系统崩溃

时间:2012-10-06 09:25:15

标签: c++ arrays opencv for-loop variable-assignment

我在这里发布了一个类似的问题:

why it crashes when assigning new values to arrays?

但是这一次,我再次遇到了阵列的另一个问题。我的代码是这样的:

double diff[600][800][3];
cv::Mat value ( height, width, CV_8UC3 );
double mean[600][800][3];
....
for ( int i =0; i < 5; ++ i )
{
    for ( int j = 0; j < 3; ++j )
    {
        for ( int m = 0; m < 2; ++m )
        {
            mean[i][j][m] = 10/m;
            diff[i][j][m] = abs ( value.data[value.cols*i+j]-mean[i][j][m]);
        }
    }
}

坠毁在线:

diff[i][j][m] = abs ( value.data[value.cols*i+j]-mean[i][j][m]);

我甚至省略了这一行,只是写了:

double test = abs ( value.data[value.cols*i+j]-mean[i][j][m]);

并编译,然后我添加了

std::cout << test << std::endl;
它又崩溃了,这条线也崩溃了:

diff[i][j][m] = test; 

我甚至改变了它:

double test = static_cast<double>(abs(value.data[value.cols*i+j]-mean[i][j][m]));
diff[i][j][m] = test;
再次,坠毁了。如果我这样写:

diff[i][j][m] = 10; 

它编译。我真的无法弄清楚问题。看起来这与堆栈溢出或数据类型无关。我甚至尝试过Aki Suihkonen对我之前问题的回答,但它无能为力。有人可以帮我找到问题吗?

2 个答案:

答案 0 :(得分:2)

    for ( int m = 0; m < 2; ++m )
    {
       mean[i][j][m] = 10/m;
       //...
     }

这导致m = 0的值除以零。可能是崩溃的原因。

答案 1 :(得分:1)

对于系统的默认堆栈大小,可能double diff[600][800][3];太大了。如果你有64位double,那么这是11.5MB,而许多编译器默认为1MB堆栈大小。

请尝试使用static double diff[600][800][3];,对其他大型数组也一样。

如果你真的需要数组是非静态的(即如果函数是可重入的),你将需要使用动态分配。