在C中释放结构数组

时间:2015-05-06 19:04:47

标签: 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中的每个元素?

free(&fooArray[0]); // Gives me error
free(fooArray[0]); // Doesn't compile

2 个答案:

答案 0 :(得分:4)

首先是这段代码

def graphiqueMatplot():
    #Not included: computation of the coordinates xS, yS,...
    try:
        delete canvas/objects # use the delete method here
    except:
        pass # leave this as pass, so it takes no action if there's an error
    f = Figure(figsize=(5,5), dpi=100)
    canvas = FigureCanvasTkAgg(f, master=courbe)
    ...

无效。

我认为你的意思是以下

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和new Foo2,您可以编写例如

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;

如果你还要释放整个阵列,那么你可以写

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

fooArray[0] = NULL;
fooArray[1] = NULL;

答案 1 :(得分:1)

struct foo* fooArray= malloc(sizeof(*fooArray)*5);

当你分配fooArray时,你分配一个缓冲区 大小是struct 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]);
顺便说一句,如果你想让一个“数组”动态增长和收缩,你就不会成为一个数组。你想要一个Single linked list

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