在嵌套结构上使用free

New*_*bie 4 c malloc free

如何在下一个程序中释放'v struct'?

#include <stdio.h>
#include <stdlib.h>

struct Quaternion{
  double r;
  struct Q_vec{
    double x;
    double y;
    double z;
  } v;
};

int main(void){

  struct Quaternion* q1Ptr = malloc(sizeof(struct Quaternion));
  q1Ptr->r = 1.0;
  q1Ptr->v.x = 2.0;
  q1Ptr->v.y = 2.0;
  q1Ptr->v.z = 2.0;

  printf("%s = (%f, %f, %f, %f)\n", "q1", q1Ptr->r, q1Ptr->v.x, q1Ptr->v.y, q1Ptr->v.z);

  free(q1Ptr);

  printf("%s = (%f, %f, %f, %f)\n", "q1", q1Ptr->r, q1Ptr->v.x, q1Ptr->v.y, q1Ptr->v.z);
  //Doesn't prints 'r', but prints x, y and z.

}
Run Code Online (Sandbox Code Playgroud)

输出为:
q1 =(1.000000,2.000000,2.000000,2.000000)
q1 =(0.000000,2.000000,2.000000,2.000000)
因此,我没有删除指向v的指针.
另外,我的分配是否正常?

编辑:感谢您的所有回复!
这只是实际程序的一小部分示例,我在释放它后并没有尝试使用指针.我只是注意到内存的持久性,并想知道我是否有内存泄漏以及如何避免它.

Dan*_*iel 6

你有一种误解.free()不需要清除分配的内存的内容,也不需要free()更改指针q1Ptr所指向的内存中的地址.free()只是将资源返回给操作系统(或者为你分配内存的任何东西).分配给该变量的值可以保持不变,并且不能保证归零free().您仍然看到free()呼叫后分配的某些值并不表示free()呼叫失败.

但是,使用指向已经存在的内存的指针free会导致未定义的行为,因为它仍然指向您已分配的内存,但它不再是您使用或访问的内存.在你的系统中,这一次似乎没问题,但你不能依赖它.