我有一些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都是不同的,这让我相信内存中会发生一些奇怪的事情。
答案 0 :(得分:2)
该行存在严重问题:
return poi;
返回本地对象的地址。当函数在函数末尾超出范围时,该数组不再存在。有关精彩的解释,请参阅:Can a local variable's memory be accessed outside its scope?。
由于这是C++
并且你想要一个动态数组,我建议你使用std::vector
。它解决了很多这样的问题。