malloc
为datastore1
结构的数组分配空间,因此只需执行free(dsdata)
就足够了。我一直在研究一个使用结构作为字符串存储的项目。我声明了一个由char类型成员组成的结构:
struct datastore1
{
char name[50];
char address[50];
char email[50];
char number[50];
char idnum[50];
};
[我知道我可以执行char *name, char *address...
,但是假设我们指定的最大长度为50。然后在使用该结构的函数上,我以30的索引大小对其进行了分配:
struct datastore1 *dsdata = malloc(30 * sizeof(struct datastore1));
应该通过访问每个索引完成将所有字符串复制到结构中,如何释放调用malloc之后使用的已分配内存?我尝试在程序结尾处执行free(dsdata)
,但不确定是否正确。我应该单独释放每个索引吗?请赐教。预先感谢您的反馈!
我应该如何释放在调用malloc之后使用的已分配内存?
我尝试在程序结尾处执行
free(dsdata)
,但不确定是否正确。
free(dsdata)
很好,因为您只需通过一次调用malloc
来分配整个空间:
struct datastore1 *dsdata = malloc(30 * sizeof(struct datastore1));
引用标准(C18),7.23.2.4-“ malloc函数”(强调我的):
7.22.3.4 malloc函数
简介
1
#include <stdlib.h> void* malloc(size_t size);
说明
2 malloc函数为大小由大小指定的对象分配空间并且其值不确定。
返回
3 malloc函数返回空指针或指向已分配空间的指针。
使用free(dsdata)
是正确的,因为malloc
一次分配了所有所需的空间,并返回了指向该数组的第一个结构变量的指针,该指针被分配给dsdata
的指针。
free()
函数“知道” dsdata
是对整个分配空间的引用。您不需要为内存中struct datastore1
类型的30个结构中的每一个单独执行此操作。
我应该分别释放每个索引吗?
否,您不需要,甚至更重要的是,您[[不应这样做;这将是Undefined Behavior:
来自标准(C18),7.23.2.5 / 3的引用-“自由功能”(强调我的::]]否则,如果参数与先前由内存管理函数返回的指针不匹配
,或者如果空间已经通过调用free或realloc释放了空间,则该行为未定义。
malloc
为datastore1
结构的数组分配空间,因此只需执行free(dsdata)
就足够了。如果在结构中您将拥有指针,并且将使用malloc
来分配每个指针,则只比您首先需要free
分配每个指针。
valgrind
。要检查程序是否正确释放了内存,请使用valgrind -v --leak-check=full --track-origins=yes ./your-program
这将在valgrind的在数组定义上下文中使用C编程语言的基本运算符虚拟处理器
上执行您的程序,并为您提供有关已用资源的完整反馈。
[]
导致创建(为了简化起见)静态
数组-这意味着数组包含在结构的大小中(如果定义为结构的一部分)或存储在堆栈中(如果在函数中定义或在全局中定义)。malloc
函数返回您可以使用的数据块的地址。该块的大小至少与您要求的一样大。当您使用free
时,在这种情况下将释放该块,这意味着该地址指向的块中的所有数据都将被释放。malloc
为datastore1
结构的数组分配空间,因此只需执行free(dsdata)
就足够了。valgrind
。要检查程序是否正确释放了内存,请使用