繁体   English   中英

免费的2D阵列。 静态指针

[英]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]);

几件事情:

  • 您需要在func中通过引用传递参数: void func(int ***arr) {
  • 然后更改释放事物的方式: free((*arr)[i]); free(*arr);
  • 最后更改您重新分配arr的方式: *arr = destMatrix;
  • 另外,不要以数字开头的变量命名-这是行不通的。
  • (另外,在func末尾的for循环中,您有++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.

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