簡體   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