从键盘输入行数m,列数n,从堆上动态分配一个m行,n列的int型二维数组,并从键盘

来源:互联网 发布:js 正则匹配 编辑:程序博客网 时间:2024/05/17 05:55

这是今天在百度知道上看到的问题,一开始感觉很简单,就感觉没有难度只是scanf,printf之类的,后来实在是无聊就想着回答一下吧,但是当我回答的时候发现这道题并不是那么简单,他需要对内存理解的很透彻的情况下才可以做出来,首先第一个难点在于他是动态的二维数组,我想了第一个解决办法是这样的

#include "stdio.h"#include "stdlib.h" int main(){    int m,n,i,j;    int **a;     scanf("%d",&m);    scanf("%d",&n);     a = (int **)malloc((m + n) * sizeof(int));    for (i = 0; i < m; i++)    {        for (j = 0; j < n; j++)        {            scanf("%d", a + i * n + j);         }    }    for (i = 0; i < m; i++)    {        for (j = 0; j < n; j++)        {            printf("%d ", *(a + i * n + j));        }        printf("\n");    }    system("pause");}


后来经过思考后发现不太合适,至少不合适他说的m行n列,后来又想到了另外一个方法如下

#include "stdio.h"#include "stdlib.h"int main(){int m,n,i,j;int **a;scanf("%d",&m);scanf("%d",&n);// 申请m个指向整形指针(其实指针和数组名是一样的,只不过数组名是固定大小内存块的起始位置// 但指针的内存大小还没有确定)的指针,也就是m行 a = (int **)malloc(m * sizeof(int *));for (i = 0; i < m; i++){// 为每一行分配n列的内存空间a[i] = (int *)malloc(n * sizeof(int));for (j = 0; j < n; j++){scanf("%d", &a[i][j]);}}for (i = 0; i < m; i++){for (j = 0; j < n; j++){printf("%d", a[i][j]);}printf("\n");}system("pause");}




0 0
原创粉丝点击