如何释放由malloc()分配的结构数组?

问题描述 投票:1回答:3

我一直在研究一个使用结构作为字符串存储的项目。我声明了一个由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),但不确定是否正确。我应该单独释放每个索引吗?请赐教。预先感谢您的反馈!

c arrays memory-management malloc free
3个回答
1
投票

1。

我应该如何释放在调用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个结构中的每一个单独执行此操作。


2。

我应该分别释放每个索引吗?

否,您不需要,甚至更重要的是,您[[不应这样做;这将是Undefined Behavior

来自标准(C18),7.23.2.5 / 3的引用-“自由功能”(强调我的::]]

否则,如果参数

与先前由内存管理函数返回的指针不匹配

,或者如果空间已经通过调用free或realloc释放了空间,则该行为未定义。
据我所知,您仅使用mallocdatastore1结构的数组分配空间,因此只需执行free(dsdata)就足够了。

如果在结构中您将拥有指针,并且将使用malloc来分配每个指针,则只比您首先需要free分配每个指针。

以上两个答案都是正确的,但是为了完全理解它是如何工作的,建议您学习如何使用valgrind。要检查程序是否正确释放了内存,请使用

valgrind -v --leak-check=full --track-origins=yes ./your-program

这将在valgrind的

虚拟处理器

上执行您的程序,并为您提供有关已用资源的完整反馈。
在数组定义上下文中使用C编程语言的基本运算符[]导致创建(为了简化起见)

静态

数组-这意味着数组包含在结构的大小中(如果定义为结构的一部分)或存储在堆栈中(如果在函数中定义或在全局中定义)。malloc函数返回您可以使用的数据块的地址。该块的大小至少与您要求的一样大。当您使用free时,在这种情况下将释放该块,这意味着该地址指向的块中的所有数据都将被释放。

0
投票
据我所知,您仅使用mallocdatastore1结构的数组分配空间,因此只需执行free(dsdata)就足够了。

0
投票
以上两个答案都是正确的,但是为了完全理解它是如何工作的,建议您学习如何使用valgrind。要检查程序是否正确释放了内存,请使用
© www.soinside.com 2019 - 2024. All rights reserved.