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释放内存的时候会出现致命错误,不知道为什么 。。。。
不常用百度知道,没啥积分。。。还望大神本着学术精神给些指点,感激不尽。。。。。。 展开
#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释放内存的时候会出现致命错误,不知道为什么 。。。。
不常用百度知道,没啥积分。。。还望大神本着学术精神给些指点,感激不尽。。。。。。 展开
2个回答
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]的时候就已经超出你分配的空间范围了,这样可能会出问题的
在用指针的时候要特别小心这种问题
展开全部
第一个问题,a的数据正确,但是 x 分配了空间却没有初始化,原始值是随机数,不是0,所以不会得到期望的结果。
另外
r=(float*)malloc(sizeof(int)*m);
d=(float*)malloc(sizeof(int)*m);
x=(float*)malloc(sizeof(int)*m);
这段不应该是 sizeof(float) 吗?
free的问题没有代码,无法判断。
另外
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; 确实会造成分配空间不足。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询