C 双指针结构

C 双指针结构,c,pointers,struct,C,Pointers,Struct,我很确定我没有做错什么,但我想我还是会问的 我们有: struct some_struct **array_of_ptrs = calloc (num, sizeof (struct some_struct*)); 现在假设我只是将“数组”中的每个指针指向一个struct some\u struct。现在,为了释放记忆,我只需: free (array_of_ptrs); 这是完全可以接受的吗?我问这个问题的原因是因为我在代码中做了类似的事情,gdb抱怨没有错误。这看起来是正确的,只要您意识

我很确定我没有做错什么,但我想我还是会问的

我们有:

struct some_struct **array_of_ptrs = calloc (num, sizeof (struct some_struct*));
现在假设我只是将“数组”中的每个指针指向一个
struct some\u struct
。现在,为了释放记忆,我只需:

free (array_of_ptrs);

这是完全可以接受的吗?我问这个问题的原因是因为我在代码中做了类似的事情,gdb抱怨没有错误。

这看起来是正确的,只要您意识到您得到的是一个指针数组,而不是一个结构数组,并且您必须自己分配指针。听起来你就是这么做的


还请记住,您可以从
array\u of_ptrs[0]
分配到
array\u of_ptrs[num-1]
。如果您分配了\u ptrs[num]数组,您就有麻烦了。

是的,您在这里所做的看起来是正确的。您正在分配一个
num
指针数组。因此,假设一个4字节的指针,4*
num
bytes,都初始化为零。如果您随后将它们分别分配给另一个指针,那么当您
释放
指针列表时,应该不会产生问题

gdb到底在抱怨什么?它是否会抱怨这些指针指向的是什么?如果实际结构本身是动态分配的,则释放指针列表不会释放每个指针指向的对象。

如果释放(数组的ptr);然后,您正在创建一个内存泄漏,因为每个条目在指针数组中都有一个指针,所以值得您做一个空闲(…);首先对每个指针执行malloc,然后发出最后的free(array_of_ptrs);。当使用指针处理链表时,这是非常类似的事情

free(array_of_ptrs); free(...); free(array_of_ptrs); while (!*array_of_ptrs){ struct *some_ptr_to_struct = *array_of_ptr; free(some_ptr_to_struct); *array_of_ptrs++; } free(array_of_ptrs); 而(!*数组\u的ptr){ struct*some_ptr_to_struct=*array_of_ptr; 免费(部分到结构); *_ptrs++的数组_; } 空闲(PTR的数组); 希望这有帮助, 顺致敬意, Tom.

假设所有的
(struct somestruct*)
指针指向已经分配的内存,是的,它看起来是正确的


至于错误,您使用的是什么版本的gcc?我在4.3.3上测试了代码,它编译时没有任何问题,即使使用
-Wall-pedantic

也会更好,如果你能给出一个复制错误的最小程序;在释放
array\u of_ptr
之前,你不是要释放
array\u of_ptr[0]
array\u of_ptr[num-1]
吗?@graeme perrow:谢谢graeme,我只是想确认一下。一定是别的什么东西把我的代码搞乱了。@jeff shattock:嗨,jeff。我不认为它在抱怨指针指向什么,不。我会尝试复制它并发布错误。谢谢。@tommieb75:但我不为数组中的这些指针调用任何东西。它们仅仅指向现有的结构(后面将讨论)。所以我看不到释放数组中每个成员的任何“点”。@tamb:哦,好吧,当你说“我只是将数组中的每个指针指向某个结构”时,我的印象是每个指针都是malloc的,指向某个结构的数组*。很抱歉给你带来了困惑。