在我发布这篇文章之前,我找了类似的东西,却找不到..
我有:
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
答案 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。