c - 了解 return 语句之前的 free() 缓冲区

标签 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;

}

如您所见,我在 test() 中创建了一个临时缓冲区 buff。在返回之前,我在 return 语句之前释放了 buff。尽管我对其进行了测试并且结果符合预期,但我不明白 test() 函数如何返回 buff 值,即使 free(buff) 是在 return buff 之前?

最佳答案

之后

free(buff);

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

您的函数 test() 分配了一个缓冲区,但随后在将其返回给 main 之前将其释放,如 ssd.

所以当 ssdmain 中被取消引用时,虽然指针仍然具有由 malloc 分配的相同值,但它不再指向你“拥有”的内存。所以从那时起,任何事情都可能发生。您的代码可能仍然有效,也可能无效。

关于c - 了解 return 语句之前的 free() 缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39690836/

相关文章:

c - 小功能段错误

c - 如何发送进程间消息?

c - 将制表符转换为空格时出现段错误

c++ - delete(非数组形式)是否知道new或new[]分配的内存总量

c++ - 使用 for 循环删除对象数组

c - __fastcall 与注册语法?

c++ - 如何使用智能指针进行自动清理?

c - 多次取消引用指针与创建临时变量

c - 当我向后浏览字符串时,为什么会在字符串开头遇到 NULL 终止字符?

ios - 不确定是不是内存泄漏(ARC)