C语言二维动态数组作为函数形参问题

本人编程菜鸟一枚,最近在写一个算法程序,用到动态数组做形参的函数。碰到一些问题,求大神看看。。。。#include"stdafx.h"#include"stdio.h"#... 本人编程菜鸟一枚,最近在写一个算法程序,用到动态数组做形参的函数。碰到一些问题,求大神看看。。。。

#include "stdafx.h"
#include "stdio.h"
#include "malloc.h"
#include "conio.h"
#include "string.h"

float sum(float **a,float *x,int m,int i)
{
float sum=0;
int k=0;
for(k=0;k<=m;k++)
{
sum=sum+a[i][k]*x[k];
//sum=sum+1;
}
return sum;
}
void main()
{
float **a=NULL;
int m=0;
int n=0;
int i,j;

printf("请输入矩阵行数:\n");
scanf("%d",&m);
printf("请输入矩阵列数:\n");
scanf("%d",&n);
m=m-1;
n=n-1;//输出数组行数与列数

a=(float**)malloc(sizeof(int*)*m);

if(a==NULL)
{
printf("分配内存失败,请输入任意键退出...");
}
for(i=0;i<=m;i++)
{
*(a+i)=(float*)malloc(sizeof(int)*n);
if(*(a+i)==NULL)
{
printf("分配内存失败,请输入任意键退出...");
}
}//给动态数组赋予行与列的值

for(i=0;i<=m;i++)
{
printf("请输入第%d行的数据:\n",i+1);
for(j=0;j<=n;j++)
{
scanf("%f",&a[i][j]);
}
}

float *r=NULL;
float *d=NULL;
float *x=NULL;
float alpha=0;
float beta=0;

r=(float*)malloc(sizeof(int)*m);
d=(float*)malloc(sizeof(int)*m);
x=(float*)malloc(sizeof(int)*m);

for(int i=0;i<=m;i++)
{
r[i]=a[i][n]-sum(a,x,m,i);
printf("i=%d,%f\n",i,sum(a,x,m,i));
}

printf("%f",r[1]);
getch();
}
主要是函数SUM调用问题,本来是想用sum函数计算二维动态矩阵的第i行与一维动态数组的点积的。
结果好像a和x的数据没有导入到函数当中去。。。(我把输出数组的那段代码删掉了)试运行结果如下:

本来应该是:r[1]=1-0*0+0*1+0*0=1的,结果等于43120.....。
还有就是使用free释放内存的时候会出现致命错误,不知道为什么 。。。。
不常用百度知道,没啥积分。。。还望大神本着学术精神给些指点,感激不尽。。。。。。
展开
 我来答
匿名用户
2014-11-18
展开全部

调用sum(a,x,m,i)的时候,x还没初始化赋值呢,当然不对了


另外前边的m和n都减一是怎么考虑的,减了一后边用到了m和n,malloc(sizeof(int*)*m)申请的内存还符合m行n列的要求么?

……
m=m-1;
n=n-1;//输出数组行数与列数

a=(float**)malloc(sizeof(int*)*m);
……
*(a+i)=(float*)malloc(sizeof(int)*n);
……
r=(float*)malloc(sizeof(int)*m);
d=(float*)malloc(sizeof(int)*m);
x=(float*)malloc(sizeof(int)*m);
……
更多追问追答
追问
哦,感谢,那个m=m-1是因为数组是从0开始嘛,如果我输入3的话,就是0,1,2,3,那这就有4个了,所以我减了1
追答
虽然这样在遍历数组的时候可以,但是在分配内存空间的时候就有问题了
比如:输入m=3的话,给r分配内存空间的时候,就只分配了3-1=2个int型大小的空间,而实际上是需要3个int型的空间才能存3个数
后面你再用到r[2]的时候就已经超出你分配的空间范围了,这样可能会出问题的
在用指针的时候要特别小心这种问题
百度网友c1994c5f8
推荐于2016-08-30 · TA获得超过1332个赞
知道小有建树答主
回答量:264
采纳率:89%
帮助的人:196万
展开全部
第一个问题,a的数据正确,但是 x 分配了空间却没有初始化,原始值是随机数,不是0,所以不会得到期望的结果。
另外
r=(float*)malloc(sizeof(int)*m);
d=(float*)malloc(sizeof(int)*m);
x=(float*)malloc(sizeof(int)*m);
这段不应该是 sizeof(float) 吗?

free的问题没有代码,无法判断。
更多追问追答
追问
感谢啊,问题解决了,还有一个想问下,x=(float*)malloc(sizeof(int)*m);这个语句,前面的float和后面的int改怎么理解呢?就是这个句子是什么意思,我是网上现学现用的。。。。
追答
1、malloc返回的指针是无类型的,前面的(float *)将指针转换为指向float类型以匹配 x 的定义 。
2、sizeof()返回某个类型的长度,单位为字节,参数是类型。在这个例子里面就是返回 int 类型的长度。因为你要分配m个float的内存空间,所以应该写成 malloc(sizeof(float)*m)
3、下面这个朋友提出的m值问题是对的。
举例:对于数组a,如果你需要 m 个元素,那么数组是从a[0]~a[m-1],而不是从a[0]~a[m]。所以你在分配空间之前 m=m-1; 确实会造成分配空间不足。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式