运行成功的代码:
#include<stdio.h>
#include<stdlib.h>
int main() {
int m, n, i, j;
int** a;
int sum ;
scanf("%d%d", &m, &n);
a = (int**)malloc(m * sizeof(int*));
for (i = 0; i < m; i++) {
a[i] = (int*)malloc(n * sizeof(int));
for (j = 0; j < n; j++) {
scanf("%d", &a[i][j]);
}
}
for (i = 0; i < m; i++) {
sum = 0;
for (j = 0; j < n; j++) {
sum = sum + a[i][j];
}
printf("%d\n", sum);
}
for (i = 0; i < m; i++) {
free(a[i]);
}
free(a);
return 0;
}
过程中遇到的问题:
1、这道题目中没有给定m的最大值,所以初始化数组时不能直接写成a[max][max].
2、数组的定义必须是常量值,显然这里的m和n不是常量,所以也不能写成a[m][n].
那应该怎样创建这个数组?
使用动态内存分配创建数组!在程序运行过程中根据需要分配内存。
怎样实现?
对于二维数组,先分配一个指向数组的指针,然后分配每个子数组,以该题为例:
先分配内存给行指针数组,如下图:
int **a;
a = (int**)malloc(m * sizeof(int*));
然后分配内存给每一行:
for (i = 0; i < m; i++) {
a[i] = (int*)malloc(n * sizeof(int));
for (j = 0; j < n; j++) {
scanf("%d", &a[i][j]);
}
}
最后记得释放内存,避免内存泄漏:
for (i = 0; i < m; i++) {
free(a[i]);
}
free(a);