如果它们被malloc重新分配,堆栈变量会发生什么?

时间:2014-10-26 04:41:37

标签: c memory stack malloc heap

我试图了解堆栈/堆变量在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内存吗?

2 个答案:

答案 0 :(得分:3)

  

分配给myParam的堆栈内存会发生什么?

没有

  

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

不,它没有浪费。如果您在myParam中设置字段,则会更改。

  

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

不,你不能。在foo中分配的内存被分配给本地变量。这是一个内存泄漏。调用

free(&myParam);

导致未定义的行为。 &myParam未使用malloc(或其函数系列)进行分配。这是未定义行为的原因。

答案 1 :(得分:0)

  

我正在尝试了解堆栈/堆变量时会发生什么   在C中混合,例如:

没有任何一致性,可重复性或有用性。未定义行为的本质。它将根据

而有所不同
  1. 每个编译器
  2. stdlib(malloc堆管理器)的每个实现
  3. 每个程序和迭代
  4. malloc / free的一个实现可能是智能堆,它会在执行任何操作之前检查传递给free()的地址的有效性,以验证它们是否在有效的“竞技场”或堆区域中。下一个malloc实现可能会假设您传递给free的指针是正确的,并且在相对于您传递的指针的地址中访问或设置隐藏的堆簿记值。由于指针不正确,因此您实际上是在整个程序堆栈中编写文件,并且可能同时对堆组织进行管理。

    没有malloc / free的标准实现,所以有很多可能性。

    就free()而言,堆栈地址只是一个垃圾值,如果free()假设地址位于由伙伴系统划分的堆区域内,它会像堆栈一样对待堆栈从实验的角度来看,堆积区域,不是好东西,也不是任何有意义的东西。

    将无效指针传递给对“fread()”或“memcpy()”的调用没有什么不同