关于动态二维数组问题

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

#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上编译运行的,如果能看出我的问题,感谢您的评论。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值