c - 如果堆栈变量被 malloc 重新分配,会发生什么情况?

标签 c memory malloc heap-memory stack-memory

我试图了解当堆栈/堆变量在 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/

相关文章:

c - 是否可以通过用户编程来控制页出和页入?如果是的话怎么办?

iphone - 这就是 Objective-C 中垃圾收集的全部内容吗?

r - 将值移动到不同的环境

c - 如何在读取文件时分配链表节点

c - 为什么我不应该在 malloc() 未分配的变量上调用 free()?

c++ - 如何将 PC (ARMv5) 地址映射到源代码?

c++ - 将命令行字符串解析为 argv 格式

客户端-服务器餐厅模拟

c - argv 命令行参数容器的真实属性

c - C 中的 BinarySearchTree - deleteWord - 保留对从树中删除的元素的引用