calloc 覆盖另一个变量的内存?
calloc overwrites another variable's memory?
我正在编写一个程序来创建灰度图像 (image
),使用对存储在源数组 (hist
) 中的数据进行计算。在为图像调用 calloc 后,存储在源数组中的数据重置为零。
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
数据发生了什么变化? hist
中的所有元素在 calloc 指令之后均为 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
您分配了 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大小计算地址,不需要自己做)
如果事先知道大小,静态分配数据就更好了
声明:
float hist[256]={0};
定义hist2img
时:
hist2img(float hist[256]){
在这种情况下,当静态索引超出范围时您会收到警告(但如果某些变量索引超出范围,仍然 crashes/UB:没有 运行 时间检查)
我正在编写一个程序来创建灰度图像 (image
),使用对存储在源数组 (hist
) 中的数据进行计算。在为图像调用 calloc 后,存储在源数组中的数据重置为零。
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
数据发生了什么变化? hist
中的所有元素在 calloc 指令之后均为 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
您分配了 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大小计算地址,不需要自己做)
如果事先知道大小,静态分配数据就更好了
声明:
float hist[256]={0};
定义hist2img
时:
hist2img(float hist[256]){
在这种情况下,当静态索引超出范围时您会收到警告(但如果某些变量索引超出范围,仍然 crashes/UB:没有 运行 时间检查)