释放堆上分配的container结构体是否会同时释放其关联的request子结构体?
结论
你的理解是正确的,释放con不会影响requests指向的堆内存,只要requests本身在当前作用域可访问,就可以正常访问它指向的结构体成员。
原理说明
- C语言的
free只会释放传入指针指向的对应单次malloc分配的堆内存块,不会递归释放指针成员指向的其他内存,更不会修改和堆内存无关的变量值。 - 你的代码里三类内存的关系是:
- 栈/全局区:存储
requests指针变量(值是struct request堆内存的地址)、存储con指针变量(值是struct container堆内存的地址) - 堆内存A:
malloc出来的struct request结构体,由requests指向 - 堆内存B:
malloc出来的struct container结构体,由con指向,它的request成员存储的是requests指针变量的地址
- 栈/全局区:存储
- 调用
free(con)只会释放堆内存B,既不会修改requests指针本身的值,也不会触碰堆内存A,因此堆内存A仍然有效。
语法注意
你写的访问语法*(requests+0)->status存在运算符优先级错误,->优先级高于*,会先执行requests+0->status导致编译失败。正确的写法可以是以下任意一种:
requests->status; requests[0].status; (*(requests + 0)).status;
内容的提问来源于stack exchange,提问作者user786
相关产品推荐
相关产品推荐

