免费2d阵列。静态指针

时间:2012-01-15 16:15:40

标签: c memory-management access-violation

我有一个静态指针

   static int **2dArr;

然后我为2d数组分配内存。 如何释放内存并将其替换为另一个阵列?

   //////////////////////////////////////////////////////////////////////////
  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
 }

我释放内存并尝试更换指针。但后来我违反了访问权限。我该怎么做才能正确?

3 个答案:

答案 0 :(得分:3)

我不完全确定你在这里要做什么,但要记住声明

arr = destMatrix;
func中的

仅将指针的本地副本设置为destMatrix。回到main(和全局),2dArr(或者你实际上称之为的任何内容,因为@nm注意到它不是有效的标识符)仍然有其原始的malloc ed值虽然你已经成功释放了func中的所有指针。如果你尝试使用或释放​​那个指针(或它仍然[可能]指向的旧指针),那么你可能会遇到各种错误。 (在这种情况下,很高兴你得到错误 - 你可能会默默地破坏其他进程所依赖的内存。)如果你打算在2dArr中更改func,你需要声明

void func(int ***arr);

并用

调用它
func(&2dArr);

这样您就可以通过解除引用来访问和更改原始值,例如

free((*arr)[i]);

答案 1 :(得分:3)

夫妻俩:

  • 您需要在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;
}

答案 2 :(得分:1)

func中,您释放了静态var 2darr的内存,看起来您打算将其设置为destMatrix,但您只是将输入指针变量的副本设置为func

如果更改为void func(int **& arr),则可以设置2darr,这是通过引用而不是值传递int **。