释放一个空**指针

问题描述

我正在编写代码以释放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的指针。只是这个。 ptrvoid***ptrvoid***ptrvoid。将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时就可以循环并停止。