我试图了解在C中混合使用堆栈/堆变量时发生的情况,例如:

typedef struct E...

void foo(E* param) {
    param = malloc(sizeof(E));
}

int main() {
    E myParam;
    foo(&myParam);
    free(&myParam); //???
}


如果运行main(),则会在main的堆栈框架上声明一些struct myParam。但是然后foo()将param指向一个malloc分配的堆内存块。分配给myParam的堆栈内存会怎样?即使我们在myParam中设置了字段,它是否“浪费”了并且不会改变?而且我们还能像上面的代码那样释放malloc的内存吗?

最佳答案

分配给myParam的堆栈内存会怎样?


没有。


  即使我们在myParam中设置了字段,它是否“浪费”了并且不会改变?


不,这不会浪费。如果在myParam中设置字段,它将改变。


  而且我们还能像上面的代码那样释放malloc的内存吗?


不,你不能。在foo中分配的内存将分配给局部变量。这是内存泄漏。呼唤

free(&myParam);


导致不确定的行为。没有使用&myParam(或其功能族)分配malloc。这是导致未定义行为的原因。

关于c - 如果通过malloc重新分配堆栈变量,会发生什么情况?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26569864/

10-08 23:18