C - 如何使用free()释放内存中的结构?

时间:2016-11-01 17:32:53

标签: c pointers struct free dynamic-memory-allocation

我需要一些帮助来为结构释放内存。

我在变量中存储指向内存位置的指针,但我想在使用后释放内存。但是,当我尝试释放内存时,它只释放第一个结构项(name)并且age保留在内存中。我的代码可以在下面看到。

int main(int argc, char **argv)
{
  struct employee {
    char *name;
    int age;
  };

  // Make pointer, employee struct and put struct in memory at pointer location
  struct employee *employee_1;
  struct employee new_employee;
  new_employee.name = "Sue";
  new_employee.age = 26;
  employee_1 = (struct employee *) malloc(sizeof(new_employee));
  (*employee_1).name = new_employee.name;
  (*employee_1).age = new_employee.age;

  // ... Some operations done
  // Deallocate memory location
  free(employee_1);
  return 0;
}

员工的姓名和年龄肯定都存储在内存位置,但我无法解除他们。我测试过这个在结构中有两个以上的项目,每次它只是第一个被解除分配的项目。

我尝试了一些不同的方法,例如在每个单独解除分配的情况下free((*employee_1).name)但这会引发错误。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:6)

不,你自己解除分配 age。这不是“malloc()和家人返回的指针”,因此您无需(呼叫)free()就可以了。

引用C11,章节§7.22.3.3,(强调我的

  

free函数导致ptr指向的空间被释放,即   可供进一步分配。如果ptr是空指针,则不执行任何操作。否则,如果   该参数与先前由内存管理返回的指针不匹配   功能,或者如果通过调用freerealloc取消分配空间   行为未定义。

另外,FWIW,free()接受一个指针,所以即使传递age成员变量的地址也是错误的。一旦程序终止,操作系统或内存管理器将自动释放已分配的内存。

总而言之,你应该只用内存管理函数(即free()和family)返回的指针调用malloc(),就是这样。其他指针,即使它们是指针,如果没有通过内存管理函数分配内存(即,snot存储由malloc()和系列返回的指针)也不必是free() - d。

例如,在您的情况下,您不会在free()上调用(*employee_1).name(而是使用employee_1->name,提供更好的可读性,恕我直言),因为内存不返回指针管理职能。这样做会调用undefined behavior

那就是please see this discussion on why not to cast the return value of malloc() and family in C.