gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:17:47 25 4
gpt4 key购买 nike

我需要一些帮助来为结构分配内存。

我在变量中存储了指向内存位置的指针,但我想在使用后重新分配内存。但是,当我尝试重新分配内存时,它仅重新分配了第一个结构项(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)起作用,但这会引发错误。任何帮助,将不胜感激。

最佳答案

不,您不会自己释放age。那不是“由malloc()和family返回的指针”,因此您不需要对此(调用)free()

引用C11,第§7.22.3.3章(重点是我的)

The free function causes the space pointed to by ptr to be deallocated, that is, made available for further allocation. If ptr is a null pointer, no action occurs. Otherwise, if the argument does not match a pointer earlier returned by a memory management function, or if the space has been deallocated by a call to free or realloc, the behavior is undefined.



另外,FWIW的 free()需要一个指针,因此即使传递 age成员变量的地址也将是错误的。一旦程序终止,分配的内存将由OS或内存管理器自动释放。

综上所述,您仅应使用内存管理功能(即 free()和family)返回的指针来调用 malloc()即可。其他指针,即使它们是指针,即使未通过内存管理功能分配内存(即,是否不存储 malloc()和family返回的指针)也不必是 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 .

关于c - C-如何使用free()释放内存中的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40365437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com