我试图了解当堆栈/堆变量在 C 中混合时会发生什么,例如:
typedef struct E...
void foo(E* param) {
param = malloc(sizeof(E));
}
int main() {
E myParam;
foo(&myParam);
free(&myParam); //???
}
如果我们运行 main(),一些 struct myParam 会在 main 的堆栈帧上声明。但随后 foo() 将 param 重新指向 malloc 的堆内存块。分配给 myParam 的堆栈内存会发生什么情况?是不是“浪费”了,即使我们在myParam中设置字段也不会改变?我们仍然可以像上面的代码一样释放 malloc 的内存吗?
最佳答案
What happens to the stack memory that was allocated to myParam?
什么都没有。
Is it "wasted" and won't change even if we set fields in myParam?
不,这并没有浪费。如果您在 myParam
中设置字段,它将会改变。
And can we still free the malloc'd memory as in the code above?
不,你不能。 foo
中分配的内存被分配给局部变量。这是内存泄漏。调用
free(&myParam);
导致未定义的行为。 &myParam
未使用 malloc
(或其函数系列)进行分配。这就是未定义行为的原因。
关于c - 如果堆栈变量被 malloc 重新分配,会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26569864/