gpt4 book ai didi

c - 自由指针数组

转载 作者:行者123 更新时间:2023-11-30 18:42:03 25 4
gpt4 key购买 nike

我有这个测试代码:

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给出'true'并发生错误,为什么?如何正确释放这样的数组?

最佳答案

Do not cast the return value of calloc()!

<小时/>

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

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

但我怀疑您想模拟一个正常、有效、合理的二维数组。在这种情况下,您有两个选择:

我。黑客解决方案:与您的几乎相同,但您需要在单独的步骤中为每一行调用内存,如下所示:

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

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

二.正确的解决方案:为什么不分配一个连续的内存块并避免对 calloc() 的所有多余调用以及所有关于什么以及何时需要 free() 的头痛?一个数组 -> 一次分配,一次释放:

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

// ...

free(arr);

不错,简单且更易于维护。

关于c - 自由指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18575310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com