[英]Free 2d array. Static pointer
我有一个静态指针
static int **2dArr;
然后我为二维数组分配内存。 如何释放该内存并将其替换为另一个阵列?
//////////////////////////////////////////////////////////////////////////
void func(int **arr) {
int i,j,k,tmp;
int **destMatrix = NULL;
destMatrix = (int**) malloc(N * sizeof(int *));
if ((destMatrix == NULL)) {
fprintf(stderr, "out of memory\n");
exit(2);
}
for (i = 0; i < N; i++) {
destMatrix[i] = (int*) malloc(N * sizeof(int));
if (destMatrix[i] == NULL) {
fprintf(stderr, "out of memory\n");
exit(2);
}
}
for(i = 0; i < N; ++i) {
free(arr[i]);
}
free(arr);
arr = NULL;
arr = destMatrix;
}
//////////////////////////////////////////////////////////////////////////
int main() {
2dArr = (int**) malloc(N * sizeof(int *));
if (2dArr== NULL) {
fprintf(stderr, "out of memory\n");
exit(2);
}
for (i = 0; i < N; i++) {
2dArr[i] = (int*) malloc(N * sizeof(int));
if (2dArr[i] == NULL) {
fprintf(stderr, "out of memory\n");
exit(2);
}
}
func(2dArr);
// try to print new array, access violation
}
我释放内存并尝试替换指针。 但是然后我有访问冲突。 如何正确执行?
我不确定您要在这里做什么,但是请记住,声明
arr = destMatrix;
在func
仅将指针的本地副本设置为destMatrix
。 回到main
(全局)中,即使您已成功释放func
所有指针, 2dArr
(或您实际调用的任何东西,因为@nm指出这不是有效的标识符)仍具有其原始的malloc
值。 。 如果您尝试在其他地方使用或释放该指针(或仍然[可能]指向的旧指针),则可能会遇到各种错误。 (在这种情况下,很高兴遇到错误-您可以默默地破坏其他进程依赖的内存。)如果打算在func
更改2dArr
,则需要声明
void func(int ***arr);
并用
func(&2dArr);
这样您就可以通过取消引用访问和更改原始值,例如
free((*arr)[i]);
几件事情:
void func(int ***arr) {
free((*arr)[i]);
和free(*arr);
*arr = destMatrix;
++i
而不是i++
)这实际上并不重要-请参阅下面的评论 我使用Valgrind调试了这些问题,请检查一下。
工作代码如下:
#include <stdio.h>
#include <stdlib.h>
#define N 10
//////////////////////////////////////////////////////////////////////////
void func(int ***arr) {
int **destMatrix = NULL;
destMatrix = malloc(N * sizeof(int *));
if ((destMatrix == NULL)) {
fprintf(stderr, "out of memory\n");
exit(2);
}
int i;
for (i = 0; i < N; i++) {
destMatrix[i] = malloc(N * sizeof(int));
if (destMatrix[i] == NULL) {
fprintf(stderr, "out of memory\n");
exit(2);
}
}
for(i = 0; i < N; i++) {
free((*arr)[i]);
}
free(*arr);
*arr = destMatrix;
}
//////////////////////////////////////////////////////////////////////////
int main() {
int **tdArr = malloc(N * sizeof(int *));
if (tdArr== NULL) {
fprintf(stderr, "out of memory\n");
exit(2);
}
int i;
for (i = 0; i < N; i++) {
tdArr[i] = malloc(N * sizeof(int));
if (tdArr[i] == NULL) {
fprintf(stderr, "out of memory\n");
exit(2);
}
}
func(&tdArr);
// try to print new array, does not get access violation
//assign numbers 0-99
int j;
for (i=0; i<N; i++){
for (j=0; j<N; j++){
tdArr[i][j] = i*10+j;
}
}
//print numbers
for (i=0; i<N; i++){
for (j=0; j<N; j++){
printf("%d\n", tdArr[i][j]);
}
}
//free internal arrays
for (i=0; i<N; i++){
free(tdArr[i]);
}
//free outer array
free(tdArr);
return 0;
}
在func
您为静态var 2darr
释放了内存,看起来您打算将其设置为destMatrix
但您只是将输入指针变量的副本设置为func
。
如果更改为void func(int **& arr)
,则可以设置2darr
,这将通过引用而不是值传递int **。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.