读书人

C语言 结构体指针有关问题代码如下

发布时间: 2013-03-26 09:54:33 作者: rapoo

C语言 结构体指针问题,代码如下,编译通过,但是无法求出运算结果,请大家帮忙。
#include"stdio.h"
#include"malloc.h"

typedef struct Matrix
{
double **a; //the pointer of the matrix which stores the start address of it, the elements of the matrix are double-type
int row_num; //the number of the rows of the matrix
int col_num; //the number of the columns of the matrix
}Matrix;

struct Matrix * newMatrix(int R, int C)
{
int i;
struct Matrix A;
struct Matrix * p=&A;
A.row_num=R;
A.col_num=C;
A.a=(double **)malloc(A.row_num*sizeof(double*));
for(i=0;i<A.row_num;i++)
{
A.a[i]=(double*)malloc(A.col_num*sizeof(double));
}
return p;
}

void deleteMatrix(Matrix *A)
{
int i;
for(i=0; i<A->row_num; i++)
{
free(A->a[i]);
}
free(A->a);
A->a=NULL;
}

struct Matrix * add(Matrix *A, Matrix *B)
{
struct Matrix *p;
if((A->row_num==B->row_num) && (A->col_num==B->col_num))
{
int i,j;
p=newMatrix(A->row_num,A->col_num);
for(i=0;i<A->row_num;i++)
{
for(j=0;j<A->col_num;j++)
{
p->a[i][j]=A->a[i][j]+B->a[i][j];
}
}
}
else
{
p=NULL;
}
return p;
}


main()
{
int i,j;
int rowNum1, colNum1, rowNum2, colNum2;
Matrix arr1, arr2, *result;

/*input A*/
printf("Matrix A\nInput rows and columns:");
scanf("%d %d", &rowNum1, &colNum1);
printf("%d rows, %d columns\n", rowNum1, colNum1);
arr1=*newMatrix(rowNum1, colNum1);
for(i=0;i<arr1.row_num;i++)
{
for(j=0;j<arr1.col_num;j++)
{
printf("Input A[%d][%d]: ",i,j);
scanf("%lf",&arr1.a[i][j]);
}
}
printf("\nmatrix A = ");
for(i=0;i<arr1.row_num;i++)
{
for(j=0;j<arr1.col_num;j++)
{
printf("%lf ",arr1.a[i][j]);
}
printf("\n ");
}

/*input B*/
printf("\n\nMatrix B\nInput rows and columns:");
scanf("%d %d", &rowNum2, &colNum2);
printf("%d rows, %d columns\n", rowNum2, colNum2);
arr2=*newMatrix(rowNum2, colNum2);
for(i=0;i<arr2.row_num;i++)
{
for(j=0;j<arr2.col_num;j++)
{
printf("Input B[%d][%d]: ",i,j);
scanf("%lf",&arr2.a[i][j]);
}
}
printf("\nMatrix B = ");


for(i=0;i<arr2.row_num;i++)
{
for(j=0;j<arr2.col_num;j++)
{
printf("%lf ",arr2.a[i][j]);

}
printf("\n ");
}

/*addition*/
result=add(&arr1,&arr2);
if(result==NULL)
{
printf("\nInvalid input for addition!\n");
}
else
{
printf("\n\nAddtion:\nA + B = ");
printf("\n%d%d\n",result->row_num,result->col_num);
for(i=0;i<result->row_num;i++)
{
for(j=0;j<result->col_num;j++)
{
printf("%lf ",result->a[i][j]);
}
printf("\n ");
}
}


/*free the memory*/
printf("\n释放arr1之前\n");
deleteMatrix(&arr1);
printf("\n释放arr2之前\n");
deleteMatrix(&arr2);
printf("\n释放result之前\n");
deleteMatrix(result);
printf("\n释放result之后\n");
}

[解决办法]
简单写了个,你的有点乱,从堆栈返回局部变量不是个好习惯,会出问题的.

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>


typedef struct int2d_matrix
{
introw, col;
int*data;
} i2dmatrix_t;

i2dmatrix_t* i2dmatrix_new(int row, int col, int* data)
{
i2dmatrix_t*imatrix;
inti;

if ((imatrix = (i2dmatrix_t*)malloc(sizeof(i2dmatrix_t))) == NULL)
{
printf("out of memory!\n");
return NULL;
}
imatrix->row = row;
imatrix->col = col;

if ((imatrix->data = (int*)calloc(row*col, sizeof(int))) == NULL)
{
printf("out of memory!\n");
free((void *)imatrix);
return NULL;
}

if (data)
for (i = 0; i < row*col; i++)
imatrix->data[i] = data[i];

return imatrix;
}

void i2dmatrix_free(i2dmatrix_t* imatrix)
{
if (imatrix)
{
if (imatrix->data)
free(imatrix->data);
free(imatrix);
}
}

i2dmatrix_t* i2dmatrix_add(const i2dmatrix_t* ma, const i2dmatrix_t* mb)
{
i2dmatrix_t* mr = NULL;

if ((ma && mb) &&
(ma->row == mb->row) && (ma->col == mb->col))
{
int i;

if ((mr = i2dmatrix_new(ma->row, ma->col, NULL)) == NULL)
return NULL;
for (i = 0; i < ma->row*ma->col; i++)
mr->data[i] = ma->data[i] + mb->data[i];
}

return mr;
}

void i2dmatrix_print(const i2dmatrix_t* m)
{
if (m && m->data)
{
int r, c;
for (r = 0; r < m->row; r++) {
for (c = 0; c < m->col; c++)


printf("%d ", m->data[r*m->col + c]);
printf("\n");
}
}
}


int main(void)
{
i2dmatrix_t* ma;
int madata[][3] = { {1, 2, 3}, {4, 5, 6} };

i2dmatrix_t* mb;
int mbdata[][3] = { {7, 5, 6}, {4, 7, 8} };

i2dmatrix_t* mr;

ma = i2dmatrix_new(sizeof(madata)/sizeof(madata[0]),
sizeof(madata[0])/sizeof(madata[0][0]),
&madata[0][0]);
if (ma == NULL) exit(EXIT_FAILURE);

mb = i2dmatrix_new(sizeof(mbdata)/sizeof(mbdata[0]),
sizeof(mbdata[0])/sizeof(mbdata[0][0]),
&mbdata[0][0]);
if (mb == NULL) exit(EXIT_FAILURE);

if ((mr = i2dmatrix_add(ma, mb)) == NULL)
exit(EXIT_FAILURE);
i2dmatrix_print(mr);

i2dmatrix_free(ma);
i2dmatrix_free(mb);
i2dmatrix_free(mr);

//getch();
return 0;
}

读书人网 >C++

热点推荐