1

我有一些 c++ 代码应该查看函数的导数并收集斜率大于某个阈值的点。这一直给我带来麻烦,所以我一直在到处打印声明以找出问题所在。我偶然发现了一个令人费解的问题,当我使用 std::cout<< 打印数组的大小时,它改变了函数的输出!这是代码片段:

int* Tools::findPoi(float* y, int size, float threshold, int width, float step, int* outsize){
int poi[size];
float* derive = derivative(smooth(y,size,width),size, step);
int n = 0;
std::cout<<size<<" data size\n";
for(int i = 0; i<size; i++) {
    if(derive[i] > threshold) {
        poi[n] = i;
        n++;
    }
}

*outsize = n-1;
return poi;
}

没有注释掉的行“std :: count ...”我得到82 poi。但是,如果我将其注释掉或删除它,我会得到 84 poi。没有其他变化,只有这个打印语句。我很困惑为什么甚至如何改变输出。任何帮助将不胜感激。

编辑:好的,所以实际上,它只是随机的。每次运行时变量 n 都不一样,这让我相信内存中发生了一些奇怪的事情。

4

1 回答 1

2

这条线有一个严重的问题:

return poi;

这将返回本地对象的地址。数组在函数结束时超出范围时不再存在。有关精彩的解释,请参阅:可以在其范围之外访问局部变量的内存吗?.

由于这是C++并且您想要一个动态数组,我建议您使用std::vector. 它解决了许多诸如此类的问题。

于 2013-07-10T17:36:21.060 回答