最保险的函数间数组作为参数值传递与返回方法,用memcpy函数!

举例代码如下:
void mycvCalcHist(IplImage *img,double out_hist[256])
{
	int i=0, j=0;  
	double temp1=0;
	int temp2=0;
    const int hist_sz = 256;//0到255,一共256个灰度值  
    double hist[hist_sz];  
    memset(hist, 0, sizeof(hist));       
    for( i = 0; i < img->height; i++ )  
    {  		
        for( j = 0; j < img->width; j++ )  
		{	temp1=cvGet2D(img,i,j).val[0];
			temp2=int(temp1);//作类型转换
            hist[temp2]++; //这里实现了hist中存储各灰度值出现的次数  
		}
    }  

	memcpy(out_hist,hist, sizeof(hist)); //肯定有人要问,为啥不用数组名作为参数传递从而改变实参数组的值
					    //这种方法一般情况下都可以,我也测试了,然而这里就是不行,我估计与
					     //memset(hist, 0, sizeof(hist));这句语句有关
}

分析:函数mycvCalcHist中自己定义了一个名为hist的数组,实际上就是out_hist这个数组,out_hist是主调函数中的数组,在这里,我只需要最后做一个memcpy即可实现值返回;如果要作值传递,我猜想也简单(并未作实际测试),进入函数时把out_hist这个数组值复制给hist就行,函数快结束时再把hist的值复制到out_hist应该就可以了!由于是局部数组,所以函数运行完后hist就给释放掉了,所以也不会多占用多少内存空间。
肯定有人要问,为啥不用数组名作为参数传递从而改变实参数组的值?这种方法一般情况下都可以,我也测试了,然而这里就是不行,我估计与memset(hist, 0, sizeof(hist));这句语句有关!所以以后遇到这种情况最保险的方法还是用memcpy函数!

你可能感兴趣的:(memcpy,数值作为参数传递)