繁体   English   中英

将内存释放到C中的2d数组

[英]freeing memory to a 2d array in C

因此,我使用以下逻辑创建了动态尺寸的2d数组:

int **newBoard;
newBoard = (int **) malloc(sizeof(int *) * rows);
newBoard[0] = (int *) malloc(sizeof(int) * cols * rows);

for (i = 0; i < rows; i++) {
    newBoard[i] = (*newBoard + cols * i);
}

但是现在我无法释放分配的内存。 每当我尝试接收“ free():无效的指针:0x00000000007343c8 ***”错误消息时。 我目前正在尝试释放内存,例如:

for (i = 0; i < rows; i++) {
    free(newBoard[i]);
}
free(newBoard);

谁能帮助我,告诉我如何正确释放它?

当你做

newBoard[0] = (int *) malloc(sizeof(int) * cols * rows);

您正在为int对象的cols * rows空间分配连续的内存块。 您只能使用开始释放一次, 不能在内存开始的偏移量释放它,也不能多次释放它, 只能释放一次

for (i = 0; i < rows; i++) {
    newBoard[i] = (*newBoard + cols * i);
}

在这里, newBoard[i]获得的是连续内存块的偏移量,因此您不能在不同的偏移量处释放一次以上,而必须在该块的开始处释放一次

free(newBoard[0]);
free(newBoard);

是正确的。

请不要malloc ,这是不好的做法。 并且您应该检查malloc返回NULL

我个人认为这是只执行2个malloc而不是row+1 malloc的聪明方法,但是它也有缺点。 您必须非常小心。 释放不需要的单个内存块是不可能的,单个newBoard[i]重新分配也是不可能的。 为了避免像多个free这样的错误,您必须要有很多纪律,这就是为什么我认为传统的总体做法更好。 我会做:

for(i = 0; i < rows; ++i)
    newBoard[i] = malloc(cols * sizeof *newBoard[i]);

那么您可以像以前一样自由。

暂无
暂无

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

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