我正在编写一个程序,使用对源数组(image
)中存储的数据的计算来创建灰度图像(hist
)。存储在源数组中的数据在调用calloc for image后重置为零。
func1(){
float * hist = (float *) calloc(256, sizeof(float));
// operation to populate 'hist'
for...{
for...{
hist.....
}
}
hist2img(hist);
free(hist);
return 0;
}
hist2img(hist){
cout << "-> " << hist [4 * 250] << endl;
unsigned char * image = (unsigned char *) calloc(256 * 256, sizeof(unsigned char));
cout << "-> " << hist [4 * 250] << endl;
free(image);
return 0;
}
输出是:
-> 0.997291
-> 0
数据会怎样? calloc指令后hist
中的所有元素都为0。我需要将image
初始化为0。
--(~$)--> gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.2) 5.4.0 20160609
--(~$)--> uname
Linux 4.7.2-040702-generic x86_64 x86_64 x86_64 GNU/Linux
答案 0 :(得分:8)
您分配了256个浮点数:
float * hist = (float *) calloc(256, sizeof(float));
您可以访问第1000个元素,即UB
cout << "-> " << hist [4 * 250] << endl;
calloc调用将一些你错误地指向
的内存归零要访问hist
的第250个浮点元素,只需
cout << "-> " << hist [250] << endl;
(因为hist
是float
上的指针,编译器通过乘以浮点大小来计算地址,不需要自己这样做)
如果您事先知道尺寸,那么静态分配数据会更好
声明:
float hist[256]={0};
定义hist2img
时:
hist2img(float hist[256]){
在这种情况下,当静态索引超出范围时会收到警告(但如果某些变量索引越界,则仍会崩溃/ UB:没有运行时检查)