繁体   English   中英

免费的指针数组

[英]Free array of pointers

我有这个测试代码:

void test2(){

    char** twoDArray = (char**)calloc(3,sizeof(char*));
    char* element1 = (char*)calloc(3,sizeof(char));

    twoDArray[0] = element1;    
    twoDArray[1] = element1;
    twoDArray[2] = element1;

    freeArray(twoDArray,3);

}

void freeArray(char** arr,int size){
    if(arr!= NULL){
        for(int i =0 ;i < size;i++){
            if(arr[i] != NULL){
                free(arr[i]);
                arr[i] = NULL;
            }
        }
        free(arr);
        arr = NULL;
    }
}

freeArray arr[1] != NULL中循环的第二次迭代中arr[1] != NULL给出'true'并发生错误,为什么? 如何正确释放这样的数组?

不要转换calloc()的返回值!


您正在为数组的每个元素分配完全相同的指针。 我不知道您为什么/如何期望它工作(因为那样您将没有类似2D的数组,因为设置一行的一个元素也会更改所有其他行中同一列的元素... )

如果您仍然坚持这种设计,那么应该只释放一次内部“数组”

但是我怀疑您想模拟一个理智,有效,明智的 2D阵列。 在这种情况下,您有两个选择:

I. hackish解决方案:与您的解决方案几乎相同,但是您需要在单独的步骤中为每一行calloc内存,如下所示:

twoDArray[0] = calloc(3, sizeof(twoDArray[0]));
twoDArray[1] = calloc(3, sizeof(twoDArray[0]));
twoDArray[2] = calloc(3, sizeof(twoDArray[0]));

(或者使用循环...如果您知道它们是什么。)

二。 正确的解决方案:为什么不分配连续的内存块,并避免对calloc()所有多余调用,以及什么时候需要free() d而感到头疼? 一数组->一分配,一解除分配:

char (*arr[3]) = calloc(3, sizeof(arr[0]));

// ...

free(arr);

美观,简单且易于维护。

如果要使用freeArray函数,则必须定义一些有关数组必须包含什么的规则。 您对freeArray实现假定了数组的每个元素都指向一个单独分配的字符数组,但是该数组的每个元素实际上都指向了相同的字符数组,因此您最终尝试释放多个相同的数组次,这是无效的。

如果freeArray的假设是正确的,那么您将需要修改创建数组的方式。 如果freeArray的假设不正确,则需要修改freeArray

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM