我需要一些帮助来为结构释放内存。
我在变量中存储指向内存位置的指针,但我想在使用后释放内存。但是,当我尝试释放内存时,它只释放第一个结构项(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)
但这会引发错误。任何帮助将不胜感激。
答案 0 :(得分:6)
不,你自己解除分配 age
。这不是“malloc()
和家人返回的指针”,因此您无需(呼叫)free()
就可以了。
引用C11
,章节§7.22.3.3,(强调我的)
free
函数导致ptr
指向的空间被释放,即 可供进一步分配。如果ptr
是空指针,则不执行任何操作。否则,如果 该参数与先前由内存管理返回的指针不匹配 功能,或者如果通过调用free
或realloc
,取消分配空间 行为未定义。
另外,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
.。