我试图了解堆栈/堆变量在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内存吗?
答案 0 :(得分:3)
分配给myParam的堆栈内存会发生什么?
没有
是否“浪费”并且即使我们在myParam中设置字段也不会改变?
不,它没有浪费。如果您在myParam
中设置字段,则会更改。
不,你不能。在我们还能像上面的代码一样释放malloc内存吗?
foo
中分配的内存被分配给本地变量。这是一个内存泄漏。调用
free(&myParam);
导致未定义的行为。 &myParam
未使用malloc
(或其函数系列)进行分配。这是未定义行为的原因。
答案 1 :(得分:0)
我正在尝试了解堆栈/堆变量时会发生什么 在C中混合,例如:
没有任何一致性,可重复性或有用性。未定义行为的本质。它将根据
而有所不同malloc / free的一个实现可能是智能堆,它会在执行任何操作之前检查传递给free()的地址的有效性,以验证它们是否在有效的“竞技场”或堆区域中。下一个malloc实现可能会假设您传递给free的指针是正确的,并且在相对于您传递的指针的地址中访问或设置隐藏的堆簿记值。由于指针不正确,因此您实际上是在整个程序堆栈中编写文件,并且可能同时对堆组织进行管理。
没有malloc / free的标准实现,所以有很多可能性。
就free()而言,堆栈地址只是一个垃圾值,如果free()假设地址位于由伙伴系统划分的堆区域内,它会像堆栈一样对待堆栈从实验的角度来看,堆积区域,不是好东西,也不是任何有意义的东西。
将无效指针传递给对“fread()”或“memcpy()”的调用没有什么不同