calloc会覆盖另一个变量的内存吗?

时间:2016-09-01 07:28:10

标签: c++ c malloc calloc data-management

我正在编写一个程序,使用对源数组(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

1 个答案:

答案 0 :(得分:8)

您分配了256个浮点数:

float * hist = (float *) calloc(256, sizeof(float));

您可以访问第1000个元素,即UB

cout << "-> " << hist [4 * 250] << endl;

calloc调用将一些你错误地指向

的内存归零

要访问hist的第250个浮点元素,只需

cout << "-> " << hist [250] << endl;

(因为histfloat上的指针,编译器通过乘以浮点大小来计算地址,不需要自己这样做)

如果您事先知道尺寸,那么静态分配数据会更好

声明:

float hist[256]={0};

定义hist2img时:

hist2img(float hist[256]){

在这种情况下,当静态索引超出范围时会收到警告(但如果某些变量索引越界,则仍会崩溃/ UB:没有运行时检查)