关于动态二维数组问题

本人菜鸟一枚,这是我写的第一篇博客,看完后有什么建议尽管提。
我这次写的是关于动态二维数组的问题,这篇其实也是我运用动态数组出了点问题待解决的一篇文章。
下面是一个简单的动态二维数组输入输出的代码(这个代码有问题,输出错误)

#include<stdio.h>
#include<stdlib.h>
int **Input(int **a,int m,int n)   //输入函数
{
    int i,j;
    a=(int **)malloc(sizeof(int*)*m);
    for(i=0;i<m;i++)
        a[i]=(int*)malloc(sizeof(int)*n);       //申请动态二维数组空间
    printf("请输入数组:\n");
    for(i=0;i<m;i++)
        for(j=0;j<n;j++)
            scanf("%d",&a[i][j]);
        return a;

}

void Output(int **a,int m,int n)
{
    int i,j;
    a=(int **)malloc(sizeof(int*)*m);
    for(i=0;i<m;i++)
        a[i]=(int*)malloc(sizeof(int)*n);
    for(i=0;i<m;i++)
        for(j=0;j<n;j++)
            printf("%d",a[i][j]);
}
void main()
{
    int **a,i,m=0,n=0;
    printf("请输入行和列:\n");
    scanf("%d%d",&m,&n);
    a=(int **)malloc(sizeof(int*)*m);
    for(i=0;i<m;i++)
        a[i]=(int*)malloc(sizeof(int)*n);
    a=Input(a,m,n);
    Output(a,m,n);
    for(i=0;i<m;i++)
        free(a[i]);
    free(a);
}

运行出来是这样:

网上说这种问题有这几种情况:
1.直接释放了一个空指针
2.一个指针被释放了两次(第二次释放了一个空指针)
3.数组越界:访问超过数组长度的内存
个人感觉应该不是第三个问题,至于第一个和第二个问题,我这段代码是动态二维数组的输入输出,主函数中的申请和释放都是正确的。我尝试了在输入输出函数里也添加了释放的代码:
for(i=0;i<m;i++)
free(a[i]);
free(a);

但都没啥卵用,所以我把子函数中的释放的代码去掉了。(感觉应该不是那个问题)
人后我又写了一段代码,这次是代码全在一个主函数中:

#include<stdio.h>
#include<stdlib.h>
void main()
{
    int **a,i,j,m=0,n=0;
    printf("请输入行和列:\n");
    scanf("%d%d",&m,&n);
    a=(int **)malloc(sizeof(int*)*m);
    for(i=0;i<m;i++)
        a[i]=(int*)malloc(sizeof(int)*n);
    printf("请输入数组:\n");
    for(i=0;i<m;i++)
        for(j=0;j<n;j++)
            scanf("%d",&a[i][j]);
    for(i=0;i<m;i++)
    {
        printf("\n");
        for(j=0;j<n;j++)
            printf("%d\t",a[i][j]);
    }
    for(i=0;i<m;i++)
        free(a[i]);
    free(a);
}

这次的却运行成功了:

但是我感觉第一个函数调用也没错呀,看了好长时间也没看出啥。
代码我是在VC++6.0上编译运行的,如果能看出我的问题,感谢您的评论。

猜你喜欢

转载自blog.csdn.net/wlswls1711/article/details/81477958