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);
}