在C中释放结构数组

在C中释放结构数组,c,pointers,C,Pointers,在我发布这篇文章之前,我找了一些类似的东西,但找不到 我有: struct foo*fooArray=malloc(sizeof(*fooArray)*5); struct foo*newFoo=malloc(sizeof(*newFoo)); fooArray[0]=*newFoo; struct foo*newFoo2=malloc(sizeof(*newFoo2)); fooArray[1]=*newFoo2; 如何释放fooArray中的每个元素? 首先是这些代码 struct fo

在我发布这篇文章之前,我找了一些类似的东西,但找不到

我有:

struct foo*fooArray=malloc(sizeof(*fooArray)*5);
struct foo*newFoo=malloc(sizeof(*newFoo));
fooArray[0]=*newFoo;
struct foo*newFoo2=malloc(sizeof(*newFoo2));
fooArray[1]=*newFoo2;
如何释放fooArray中的每个元素?

首先是这些代码

struct foo* fooArray= malloc(sizeof(*fooArray)*5);
struct foo* newFoo = malloc(sizeof(*newFoo));
fooArray[0]=*newFoo;
struct foo* newFoo2 = malloc(sizeof(*newFoo2));
fooArray[1]=*newFoo2;
这是无效的

我想你的意思是

struct foo** fooArray= malloc(sizeof(*fooArray)*5);
struct foo* newFoo = malloc(sizeof(newFoo));
fooArray[0]=newFoo;
struct foo* newFoo2 = malloc(sizeof(newFoo2));
fooArray[1]=newFoo2;
要仅释放这两个分配的元素newFoo和newfoo2,您可以编写以下示例

free( fooArray[0] );
free( fooArray[1] );

fooArray[0] = NULL;
fooArray[1] = NULL;
如果还希望释放整个数组,则可以编写

free( fooArray[0] );
free( fooArray[1] );

free( fooArray );
首先是这些代码

struct foo* fooArray= malloc(sizeof(*fooArray)*5);
struct foo* newFoo = malloc(sizeof(*newFoo));
fooArray[0]=*newFoo;
struct foo* newFoo2 = malloc(sizeof(*newFoo2));
fooArray[1]=*newFoo2;
这是无效的

我想你的意思是

struct foo** fooArray= malloc(sizeof(*fooArray)*5);
struct foo* newFoo = malloc(sizeof(newFoo));
fooArray[0]=newFoo;
struct foo* newFoo2 = malloc(sizeof(newFoo2));
fooArray[1]=newFoo2;
要仅释放这两个分配的元素newFoo和newfoo2,您可以编写以下示例

free( fooArray[0] );
free( fooArray[1] );

fooArray[0] = NULL;
fooArray[1] = NULL;
如果还希望释放整个数组,则可以编写

free( fooArray[0] );
free( fooArray[1] );

free( fooArray );
分配fooArray时,分配一个 大小为结构foo的5倍。如果您想保存5个struct foo,您是很好的,但不必对数组成员进行malloc:

struct foo* newFoo = fooArray
struct foo* newFoo2 = fooArray + 1;
struct foo* newFoo3 = &fooArray[2]; /* array notation */
…你只能一次把它们全部释放出来

free(fooArray);
但是

如果你想要一组5个指针,那么大小是错误的, 左边的数据类型是错误的

struct foo* fooArray= malloc(sizeof(*fooArray)*5);
应改为:

struct foo** fooArray = malloc(sizeof(struct foo*) * 5);
它是指向5个指针的指针。 然后,您的数组表示法可以用于分配和释放

fooArray[0] = malloc(sizeof struct foo);
free(fooArray[0]);
顺便说一句,如果你想要一个“数组”动态地增长和收缩,你不需要数组。你想要一杯吗

只要在structfoo中包含一个(structfoo*)指针,就可以去掉fooArray

分配fooArray时,分配一个 大小为结构foo的5倍。如果您想保存5个struct foo,您是很好的,但不必对数组成员进行malloc:

struct foo* newFoo = fooArray
struct foo* newFoo2 = fooArray + 1;
struct foo* newFoo3 = &fooArray[2]; /* array notation */
…你只能一次把它们全部释放出来

free(fooArray);
但是

如果你想要一组5个指针,那么大小是错误的, 左边的数据类型是错误的

struct foo* fooArray= malloc(sizeof(*fooArray)*5);
应改为:

struct foo** fooArray = malloc(sizeof(struct foo*) * 5);
它是指向5个指针的指针。 然后,您的数组表示法可以用于分配和释放

fooArray[0] = malloc(sizeof struct foo);
free(fooArray[0]);
顺便说一句,如果你想要一个“数组”动态地增长和收缩,你不需要数组。你想要一杯吗


只需在struct foo中包含一个(struct foo*)指针,就可以取消fooArray。

为什么要在
newFoo
中分配指针?我认为您应该分配一个
foo
结构,就像在
malloc(sizeof(foo))
中一样
free()
需要malloc系列函数返回指针。我不确定您对所有这些赋值的意图是什么…如果这正是您编写的代码的外观,那么您还有很多问题…我正在尝试保存一个foo struct数组,然后我希望释放其中的每个元素。代码确实保存了一个结构数组。您只能释放已分配的内容。如果分配了整个阵列,则必须释放整个阵列。除非单独分配,否则无法选择单独释放对象。1个malloc,1个free,没有例外。为什么要在
newFoo
中分配指针?我认为您应该分配一个
foo
结构,就像在
malloc(sizeof(foo))
中一样
free()
需要malloc系列函数返回指针。我不确定您对所有这些赋值的意图是什么…如果这正是您编写的代码的外观,那么您还有很多问题…我正在尝试保存一个foo struct数组,然后我希望释放其中的每个元素。代码确实保存了一个结构数组。您只能释放已分配的内容。如果分配了整个阵列,则必须释放整个阵列。除非单独分配,否则无法选择单独释放对象。1个malloc,1个free,没有例外。事实上,正如我所写的那样,它确实对我有效。它保存了一个foo数组,没有**@Lee,因为我写的代码是无效的。你应该决定是要创建一个由5个指向结构对象的指针组成的数组,还是创建一个由5个结构对象组成的数组。事实上,在我编写代码时,它确实对我起作用。在我编写代码时,它保存了一个没有**@Lee的foo数组。你的代码无效。您应该决定是要创建一个由5个指向结构对象的指针组成的数组,还是创建一个由5个结构对象组成的数组。