[英]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.