【发布时间】:2020-11-15 12:47:55
【问题描述】:
我尝试创建为二维数组动态分配内存并将一些整数值放入数组的函数。总体而言,该功能按预期工作,但存在一些错误。所以我在main() 中做了同样的事情并得到了正确的结果。我的代码如下:
#include <stdlib.h>
#include <stdio.h>
void test(int d1, int d2, int ***p){
int value;
*p = (int **)(malloc(sizeof(int)*d1));
for (int i = 0; i < d1; i++){
(*p)[i] = (int *)(malloc(sizeof(int)*d2));
for (int j = 0; j < d2; j++){
(*p)[i][j] = i * 10 + j;
}
}
printf("\n");
}
int main(void){
int d1, d2;
int ** ptr;
printf("length of 1st dimension?\n");
scanf("%d", &d1);
printf("length of 2nd dimension?\n");
scanf("%d", &d2);
test(d1, d2, &ptr);
for (int i=0; i<d1; i++){
for (int j=0; j<d2; j++){
printf("%d ", ptr[i][j]);
}
printf("\n");
}
free(ptr);
ptr = (int **)(malloc(sizeof(int)*d1));
for (int i=0; i< d1; i++){
ptr[i] = (int *)(malloc(sizeof(int)*d2));
for (int j=0; j<d2; j++){
ptr[i][j] = i *10 +j;
}
}
printf("\n######################\n\n");
for (int i=0;i<d1;i++){
for (int j=0; j<d2;j++){
printf("%d ", ptr[i][j]);
}
printf("\n");
}
free(ptr);
return 0;
}`
当我将 5 作为第 1 维和第 2 维的长度传递时,我得到如下结果:
length of 1st dimension?
5
length of 2nd dimension?
5
532699424 32725 2 3 4
10 11 12 13 14
20 21 22 23 24
30 31 32 33 34
40 41 42 43 44
######################
0 1 2 3 4
10 11 12 13 14
20 21 22 23 24
30 31 32 33 34
40 41 42 43 44
我认为,除了我将指向指针的指针作为参数传递给函数之外,我做了同样的事情。但是,第一行中的某些值是不同的。每当我执行该函数时,第一行的值就不同。
谁能告诉我我做错了什么?
提前谢谢你。
【问题讨论】:
-
对
free(ptr)的调用都泄漏了大量内存。您必须更加努力地释放这些数组。您可能需要一个函数来正确完成这项工作(至少,避免两次编写相同的代码)。