我有一个静态指针
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
}
我释放内存并尝试更换指针。但后来我违反了访问权限。我该怎么做才能正确?
答案 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)
夫妻俩:
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;
}
答案 2 :(得分:1)
在func
中,您释放了静态var 2darr
的内存,看起来您打算将其设置为destMatrix
,但您只是将输入指针变量的副本设置为func
。
如果更改为void func(int **& arr)
,则可以设置2darr
,这是通过引用而不是值传递int **。