先分配行 p = malloc(sizeof(int*)*m) ,再逐行分配列 p[i] = malloc(sizeof(int) * n)
//二级指针如何分配动态内存并赋值 #include <stdio.h> #include <stdlib.h> int main(void) { int **p = NULL; //最好是显式初始化这个二级指针 以防不测 int m, n, i, j; printf("请输入数组的行数和列数: 例如格式:5,6 :代表5行6列 "); scanf("%d,%d", &m, &n); p = malloc(sizeof(int*)*m); //这里没必要强制类型转换 p已定义成int** if(!p) { //作个简单的malloc是否成功的检测 printf("malloc失败! "); return 1; //失败后直接退出程序 } for(i = 0; i < m; i++) { p[i] = malloc(sizeof(int) * n); if(!p[i]) { //还是要检测内存开辟是否成功 printf("i = %d malloc失败! ", i); return 1; //失败后直接退出程序 } } //这里也没必要强制类型转换 p[i]默认就是int* printf("请输入数组的%d行和%d列的数组数值 ",m,n); for(i = 0; i < m; i++) { for(j = 0; j < n; j++) { scanf("%d", &p[i][j]); //这里要用& 因为p[i][j]是int型 //或者你改成 *(p + i) + j //scanf("%d", *(p + i) + j); } } printf("将%d行和%d列的数组数值打印出来 ",m,n); for(i = 0; i < m; i++) { for(j = 0; j < n; j++) { printf("%d ", p[i][j]); } printf(" "); } for(i = 0; i < m; i++) free(p[i]); //由里层开始释放开辟的内存 free(p); //只要malloc了就别忘了free return 0; }
http://bbs.bccn.net/thread-440957-1-1.html
非常感谢 longwu9t 的无私奉献!