我写了一段计算矩阵的转置矩阵的程序,运行虽然没有报错,但是我觉得我程序里是不是有两个错误?
(1)验证了if( AT == NULL )之后,没必要再验证if( AT[i] == NULL )吧?属于多此一举;
(2)定义**XT后缺少生成2行5列的全零矩阵的步骤。程序这次虽然没有出错,但容易出现内存地址被占用的情况?
有没有大牛给指点两句?谢谢
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
double ** Mat_tra(double **A,int Row_A,int Line_A)
//子函数:计算矩阵A的转置矩阵AT,
{
double **AT;//创建A的转置矩阵
int i,j;
AT=(double**)calloc(Line_A,sizeof(double*)); //
if( AT == NULL )
{
printf( "内存分配失败\n" );
return 0;
}
else
{};
for(i=0;i<Line_A;i++)
{
AT[i]=(double*)calloc(Row_A,sizeof(double));//
if( AT[i] == NULL )
{
printf( "内存分配失败\n" );
return 0;
}
else
{};
for(j=0;j<Row_A;j++)
{
AT[i][j]=A[j][i];
}
}
return AT;
}
void Print_mat(double **A,int Row_A,int Line_A)
//子函数:打印数组
{
int i,j;
for(i=0;i<Row_A;i++)//
{
for(j=0;j<Line_A;j++)
{
printf("%5.3g ",A[i][j]);
if(Line_A!=1)
//如果 Line_A==1,则会出现除以0的情况,子函数会不报错就退出;
{
if ((j!=0)&(j%(Line_A-1)==0) )
printf("\n");
}
else
{
printf("\n");
}
}
}
printf("\n");
}
int main()
{
double **X,**XT;
int i,j;
int Row_X=2;
int Line_X=5;
int Row_XT=5;
int Line_XT=2;
X=(double**)calloc(Row_X,sizeof(double*));
if( X == NULL )
{
printf( "内存分配失败\n" );
return 0;
}
else
{};
for(i=0;i<Row_X;i++)//
{
X[i]=(double*)calloc(Line_X,sizeof(double));
if( X[i] == NULL )
{
printf( "内存分配失败\n" );
return 0;
}
else
{};
for(j=0;j<Line_X;j++)
{
X[i][j]=i+j*j;
}
}
XT=Mat_tra(X,Row_X,Line_X);
//将X转置并复制到指针XT标识的内存中
Print_mat(X,Row_X,Line_X);
Print_mat(XT,Row_XT,Line_XT);
return 0;
}
--
FROM 111.193.233.*