0

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

为什么在为数组分配新值时会崩溃?

但这一次,我又遇到了数组的另一个问题。我的代码是这样的:

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 对我之前的问题的回答,但它无济于事。有人可以帮我在这里找到问题吗?

4

2 回答 2

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

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

于 2012-10-06T10:56:02.760 回答
1

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

改为尝试static double diff[600][800][3];,对于您的其他大型阵列也是如此。

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

于 2015-07-30T01:02:12.083 回答