问题描述
我正在编写代码以释放C(void **ptr
)中的通用双指针。如何检查指针是否通过malloc
/ calloc
分配了?如何释放内部指针? (我学会了通过使用for
循环并在指针中获得成员的数量来做到这一点,但是在这里我没有得到。)函数声明是
void freeArray(void **ptr);
您将如何释放该指针,并进行错误检查以确保不会出现段错误或内存泄漏或其他内存错误?
解决方法
我正在编写代码以释放C语言中的通用双指针(无效** ptr)。
我相信没有通用双指针这样的东西。指针就是:指针。
如何检查指针是否通过malloc / calloc分配?
您没有。没有分配指针。分配内存,并将该区域的地址分配给指针。
如何释放内部指针? (我学会了通过使用 for循环并获得指针中的成员数量,但是我 这里没有给出。)。函数声明是
void freeArray(void **ptr);
我相信“内部指针” 对于这种用法不是一个很好的描述。
无论如何,将您的函数原型与通常的main()原型进行比较
int main(int argc,char** argv)
,您会发现这里缺少某些东西。
也许你会写
void** ptr = NULL;
您要声明ptr
。作为指针。但是ptr
到现在已经分配了。它是静态的。可能是4可能是8个字节。它指向void
的指针。只是这个。
ptr
是void**
,*ptr
是void*
,**ptr
是void
。将ptr
用作指针块时,必须与系统对main()
进行的操作相同:构建该块并保留自己的argc
(值的计数)。这样做是您的问题,或者更好的是,不这样做是您的问题。
试试这个:
void freeArray(int ptrc,void** ptr);
并使这对始终保持在一起并进行更新,因此“获得指针中的成员数目”的部分毫无疑问。
,没有一种可移植的方法来确定ptr
是否指向已分配的块,该块的大小,该块中的指针是否有效并指向分配的内存。
freeArray
被赋予一个指向void
指针数组的指针。由于没有关于空闲指针数量的信息,因此必须进行以下假设:
-
两个指针的数量都是固定的。假设您的程序到处都在处理3个指针的数组,那么
freeArray
可能会释放3个指针... -
,否则该数组可以为null终止,例如将
argv
数组传递给main
。但是请注意,这种特定的字符串数组并不能以这种方式释放。
查看分配数组的代码并确定使用哪种约定。
这是freeArray()
的幼稚实现,用于指向已分配块的空终止指针分配数组:
void freeArray(void **ptr) {
if (ptr) {
for (size_t i = 0; ptr[i]; i++) {
free(ptr[i]);
}
free(ptr);
}
}
,
释放指针不会更改,无论它是使用malloc还是calloc分配的,如果您想释放指针数组,则应该在指针长度之前知道。除非您现在数组的最后一个元素为NULL,否则遇到NULL时就可以循环并停止。