malloc是递归工作的吗?

malloc是递归工作的吗?,c,malloc,C,Malloc,我有一个向量结构a,大小在编译时未知 每个结构a都包含一个指向结构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;

我有一个向量
结构a
,大小在编译时未知

每个
结构a
都包含一个指向
结构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;
 }
当同一指针中有分配的内存块时,结构b向量是否会自动释放?或者我必须首先为
结构a
向量中的每个项目释放单个
结构b
向量吗

已经被建议作为这篇文章的副本,但这里的问题是询问
free
调用中的现有功能,而不是询问如何进行递归过程的建议。

对于每个
malloc()
,必须有一个对称的
free()

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

运行:


阅读您的错误

简短回答:不,您必须为每个
malloc
都提供
免费

更好的答案是:仍然没有,但是您可以编写一个函数来释放多个结构成员。下面是一个例子:

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

另外:。

不,您必须手动执行。此外,您不应该强制执行
malloc
文档的哪一部分使您相信可能会出现这种情况?不要强制执行
malloc
的结果。对于每个
malloc
,必须调用
free
,以避免内存泄漏。是的,这也适用于内部嵌套的
struct
s。可能重复的
free()
允许
free(NULL)
。一个类似于free的函数在保护自身的情况下会更接近于该函数,比如
if(foo)free(foo->v)我不知道这个
valgrind
-工具。这是一个很好的、建设性的回答,这使得阅读本文的任何人都可以轻松地证明是否存在泄漏。谢谢
valgrind --leak-check=full ./my_prog
void freeStruct(struct a *foo)
{
    free(foo->v);
    free(foo);
}