malloc是递归工作的吗?

时间:2016-12-04 17:06:42

标签: c malloc

我有一个struct a的向量,大小在编译时是未知的。

每个struct a都包含指向struct b向量的指针。 struct b的向量长度在编译时是未知的。

所以,如果我这样做:

 #include <stdio.h>
 #include <stdlib.h>

 struct b {
    int n;
 };

 struct a {
    int n;
    struct b *v;
 };

 int main() {

    struct a *s;
    struct a *ta;
    struct b *tb;

    s = (struct a*)malloc(sizeof(struct a) * 32);
    s->v = (struct b*)malloc(sizeof(struct b) * 32);
    s->n = 1234;
    ((s->v)+1)->n = 5678;

    fprintf(stderr, "%p: %i / %p: %i\n", s, s->n, (s->v)+1, ((s->v)+1)->n);

    ta = s;
    tb = (s->v)+1;

    free(s);
    fprintf(stderr, "%p: %i / %p: %i\n", ta, ta->n, tb, tb->n);

    return 0;
 }

输出例如:

 0x1cb3010: 1234 / 0x1cb3224: 5678
 0x1cb3010: -1526330504 / 0x1cb3224: 5678

当同一指针中有分配的内存块时,struct b是否可以自动获取释放?或者,我是否必须先为struct b向量中的每个项目释放单个struct a向量?

The question on this link已被建议作为此帖的副本,但此处的问题是询问free调用中的现有功能,而不是询问有关如何进行递归过程的建议

2 个答案:

答案 0 :(得分:4)

简短回答:不,您必须为free {。}} malloc。{/ p>

更好的答案:仍然没有,但你可以编写一个函数来释放多个struct成员。这是一个例子:

void freeStruct(struct a *foo)
{
    free(foo->v);
    free(foo);
}

另外:Don't cast the return value of malloc

答案 1 :(得分:2)

对于每个malloc(),您必须具有对称free()

如果您在linux环境中工作,可以使用valgrind检查您的程序。

运行:

valgrind --leak-check=full ./my_prog

并阅读您的错误