user-0 提问: C语言：动态内存分配的二维数组初始化后，使用free()无法释放内存，程序崩溃！！！！

回复:
user: user-1
content: 引用 18 楼 yuanlai_ 的回复:[quote=引用 16 楼 lin5161678 的回复:] [quote=引用 15 楼 yuanlai_ 的回复:] [quote=引用 14 楼 lin5161678 的回复:] [quote=引用 13 楼 yuanlai_ 的回复:] [quote=引用 12 楼 lin5161678 的回复:] [quote=引用 10 楼 yuanlai_ 的回复:] 数组指针。意思有数组里面都是指针 要循环清理。把N个全部释放掉你说的是指针数组[/quote]  int **alloc2Dmem1(int base,int row,int line) {     int **p=(int **)malloc(line*sizeof(int *));     for(int i=0;i<line;i++)     {         p[i]=(int *)malloc(base*row);     //p为首行地址 p[i]每次增加一个int *空间     }      return p; }  void free2dspace(int **p,int n) {     for(int i=0;i<n;i++)     {         free(p[i]);     }     free(p); }  [/quote]你写的这段代码 和数组指针 和指针数组 都没关系  这是一个二级指针 [/quote]  有没有看懂 二维空间啊[/quote] 我当然可以看懂了 多简单啊  二维空间用数组指针 指针数组 二级指针 都可以实现  你前面 把数组指针解释成指针数组 后面写了一个二级指针的实现  完美的混淆了三种不同操作 [/quote]  解决问题  问的是二维空间的释放 指针数组和二级指针都是用来指向二维空间的[/quote] 数组指针指向一维数组的指针

user: user-1
content: 引用 16 楼 lin5161678 的回复:[quote=引用 15 楼 yuanlai_ 的回复:] [quote=引用 14 楼 lin5161678 的回复:] [quote=引用 13 楼 yuanlai_ 的回复:] [quote=引用 12 楼 lin5161678 的回复:] [quote=引用 10 楼 yuanlai_ 的回复:] 数组指针。意思有数组里面都是指针 要循环清理。把N个全部释放掉你说的是指针数组[/quote]  int **alloc2Dmem1(int base,int row,int line) {     int **p=(int **)malloc(line*sizeof(int *));     for(int i=0;i<line;i++)     {         p[i]=(int *)malloc(base*row);     //p为首行地址 p[i]每次增加一个int *空间     }      return p; }  void free2dspace(int **p,int n) {     for(int i=0;i<n;i++)     {         free(p[i]);     }     free(p); }  [/quote]你写的这段代码 和数组指针 和指针数组 都没关系  这是一个二级指针 [/quote]  有没有看懂 二维空间啊[/quote] 我当然可以看懂了 多简单啊  二维空间用数组指针 指针数组 二级指针 都可以实现  你前面 把数组指针解释成指针数组 后面写了一个二级指针的实现  完美的混淆了三种不同操作 [/quote]  解决问题  问的是二维空间的释放 指针数组和二级指针都是用来指向二维空间的

user: user-1
content: 解决问题  问的是二维空间的释放 指针数组和二级指针都是用来指向二维空间的

user: user-2
content: 引用 15 楼 yuanlai_ 的回复:[quote=引用 14 楼 lin5161678 的回复:] [quote=引用 13 楼 yuanlai_ 的回复:] [quote=引用 12 楼 lin5161678 的回复:] [quote=引用 10 楼 yuanlai_ 的回复:] 数组指针。意思有数组里面都是指针 要循环清理。把N个全部释放掉你说的是指针数组[/quote]  int **alloc2Dmem1(int base,int row,int line) {     int **p=(int **)malloc(line*sizeof(int *));     for(int i=0;i<line;i++)     {         p[i]=(int *)malloc(base*row);     //p为首行地址 p[i]每次增加一个int *空间     }      return p; }  void free2dspace(int **p,int n) {     for(int i=0;i<n;i++)     {         free(p[i]);     }     free(p); }  [/quote]你写的这段代码 和数组指针 和指针数组 都没关系  这是一个二级指针 [/quote]  有没有看懂 二维空间啊[/quote] 我当然可以看懂了 多简单啊  二维空间用数组指针 指针数组 二级指针 都可以实现  你前面 把数组指针解释成指针数组 后面写了一个二级指针的实现  完美的混淆了三种不同操作

user: user-3
content: 这都写得切末玩意儿啊，我操 你到底懂不懂c语言的基本知识  数组，指针，内存，地址这些东西 你的代码一塌糊涂

user: user-1
content: 引用 14 楼 lin5161678 的回复:[quote=引用 13 楼 yuanlai_ 的回复:] [quote=引用 12 楼 lin5161678 的回复:] [quote=引用 10 楼 yuanlai_ 的回复:] 数组指针。意思有数组里面都是指针 要循环清理。把N个全部释放掉你说的是指针数组[/quote]  int **alloc2Dmem1(int base,int row,int line) {     int **p=(int **)malloc(line*sizeof(int *));     for(int i=0;i<line;i++)     {         p[i]=(int *)malloc(base*row);     //p为首行地址 p[i]每次增加一个int *空间     }      return p; }  void free2dspace(int **p,int n) {     for(int i=0;i<n;i++)     {         free(p[i]);     }     free(p); }  [/quote]你写的这段代码 和数组指针 和指针数组 都没关系  这是一个二级指针 [/quote]  有没有看懂 二维空间啊

user: user-2
content: 引用 13 楼 yuanlai_ 的回复:[quote=引用 12 楼 lin5161678 的回复:] [quote=引用 10 楼 yuanlai_ 的回复:] 数组指针。意思有数组里面都是指针 要循环清理。把N个全部释放掉你说的是指针数组[/quote]  int **alloc2Dmem1(int base,int row,int line) {     int **p=(int **)malloc(line*sizeof(int *));     for(int i=0;i<line;i++)     {         p[i]=(int *)malloc(base*row);     //p为首行地址 p[i]每次增加一个int *空间     }      return p; }  void free2dspace(int **p,int n) {     for(int i=0;i<n;i++)     {         free(p[i]);     }     free(p); }  [/quote]你写的这段代码 和数组指针 和指针数组 都没关系  这是一个二级指针

user: user-1
content: 引用 12 楼 lin5161678 的回复:[quote=引用 10 楼 yuanlai_ 的回复:] 数组指针。意思有数组里面都是指针 要循环清理。把N个全部释放掉你说的是指针数组[/quote]  int **alloc2Dmem1(int base,int row,int line) {     int **p=(int **)malloc(line*sizeof(int *));     for(int i=0;i<line;i++)     {         p[i]=(int *)malloc(base*row);     //p为首行地址 p[i]每次增加一个int *空间     }      return p; }  void free2dspace(int **p,int n) {     for(int i=0;i<n;i++)     {         free(p[i]);     }     free(p); }

user: user-2
content: 引用 10 楼 yuanlai_ 的回复:数组指针。意思有数组里面都是指针 要循环清理。把N个全部释放掉你说的是指针数组

user: user-2
content: 引用 10 楼 yuanlai_ 的回复:数组指针。意思有数组里面都是指针 要循环清理。把N个全部释放掉你说的是指针shuz

user: user-4
content: shishi

user: user-2
content: //二级指针     char **a;     a = (char*)malloc(sizeof(char*[13])); 纠正 //二级指针     char **a;     a = (char**)malloc(sizeof(char*[13]));     for(int i=0;i<13;i++)

user: user-2
content: 引用 13 楼 yuanlai_ 的回复: 二维空间   //数组指针 	char (*a)[50]; 	a = (char (*)[50])malloc(sizeof(char[13][50])); 	int i,j; 	for(i=0;i<13;i++) 		for(j=0;j<50;j++) 			a[i][j] = 0; 	free(a);                      //指针数组 	char *a[13]; 	for(int i=0;i<13;i++) 		a[i] = (char*)malloc(sizeof(char[50]));  	for(int i=0;i<13;i++) 		for(int j=0;j<50;j++) 			a[i][j] = 0; 			 	for(int i=0;i<13;i++) 		free(a[i]);   		 //二级指针 	char **a; 	a = (char*)malloc(sizeof(char*[13])); 	for(int i=0;i<13;i++) 		a[i] = (char*)malloc(sizeof(char[50])); 		 	for(int i=0;i<13;i++) 		for(int j=0;j<50;j++) 			a[i][j] = 0; 	       	for(int i=0;i<13;i++) 		free(a[i]);   	free(a);    都是二维空间  但区别很大啊 少年

user: user-0
content: while(1);没有，程序就是异常退出的，cmd窗口上显示程序返回值不是0；

user: user-5
content: #include<stdio.h> #include<stdlib.h>  int main() { 	int N; 	int i; 	char **name = NULL; 	scanf("%d", &N); 	 	/*建立二级指针*/ 	name = (char **)malloc(sizeof(char *) * N); 	for (i = 0; i < N; i++) { 		name[i] = malloc(sizeof(char) * 11); 	} 	 	/*释放二级指针*/ 	for(i = 0; i < N; i++) { 		free(name[i]); 		name[i] = NULL; 	} 	free(name); 	name = NULL; 	return 0; }

user: user-6
content: 引用 7 楼 自信男孩 的回复:#include <stdio.h> #include <stdlib.h>  int main() {     const char N = 50;      char (*a)[N];     a = (char (*)[N])malloc(sizeof(char) * 13 * 50);//分配13个指向 char (*)[N]的指针      //a = b;     /*--------将数组所以元素初始化为0--------*/ //初始化操作     int i,j;     for(i=0;i<13;i++)         for(j=0;j<N;j++)             a[i][j] = 0;      free(a);     printf("Successfully free the a!\n");      return 0; }  供参考！ 这句改成这样也可以：  a = (char (*)[N])malloc(sizeof(char) * 13 * N);

user: user-6
content: #include <stdio.h> #include <stdlib.h>  int main() {     const char N = 50;      char (*a)[N];     a = (char (*)[N])malloc(sizeof(char) * 13 * 50);//分配13个指向 char (*)[N]的指针      //a = b;     /*--------将数组所以元素初始化为0--------*/ //初始化操作     int i,j;     for(i=0;i<13;i++)         for(j=0;j<N;j++)             a[i][j] = 0;      free(a);     printf("Successfully free the a!\n");      return 0; }  供参考！

user: user-7
content: 二维数组不是那样申请的，要么一次性申请全量内存；要么分两次申请，先申请一维指针，再每一维申请内存

user: user-2
content: 楼上2位 解析说得不错 但代码写得不好  a = (char (*)[N])malloc(sizeof(char[13][N])); 就可以了

user: user-8
content: 顶3楼，很详细了。 如果只想malloc一次，也可以， 分配连续内存，自行分割使用  char* a = malloc(13 * 50);