在return语句之前理解free()缓冲区

Ada*_*dam 0 c pointers memory-management

我想了解从函数调用返回指针的行为.假设我有以下简单代码:

int main(){
    int i;
    float *ssd;
    ssd = test();

    for (i = 0; i < 3; ++i) {
        printf("%f, ", ssd[i]);
    }
    printf("\n \n");

    memset(ssd, 0.0, 3*sizeof(float));

    for (i = 0; i < 3; ++i) {
        printf("%f, ", ssd[i]);
    }
    printf("\n \n");

}

float *test(){

    float *buff = malloc(3* sizeof(float));
    int i;
    for (i = 0; i < 3; ++i) {
        buff[i] = (float) (6.31 + i);
    }

    free(buff);
    return buff;

}
Run Code Online (Sandbox Code Playgroud)

如你所见,我在buff里面创建了一个临时缓冲区test().在我回来之前,我buffreturn声明之前释放了.虽然我测试了它并且结果是预期的,但我不明白test()函数如何返回buff值,即使free(buff)是在returnbuff 之前?

Wea*_*ane 5

free(buff);
Run Code Online (Sandbox Code Playgroud)

取消引用的任何进一步操作buff都是未定义的行为.

你的功能test()分配一个缓冲区,但随后free将其返回到之前的IT main作为ssd.

因此,当ssd取消引用时main,尽管指针仍具有与其分配的相同值malloc,但它不再指向您"拥有"的内存.从那时起,任何事情都可能发生.您的代码可能仍然有效,或者可能没有.