读书人

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

发布时间: 2012-10-13 11:38:17 作者: 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");
}


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

C/C++ code
#include <stdio.h>#include <stdlib.h>#include <malloc.h>typedef struct int2d_matrix{    int        row, col;    int*    data;} i2dmatrix_t;i2dmatrix_t* i2dmatrix_new(int row, int col, int* data){    i2dmatrix_t*    imatrix;    int                i;    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++

热点推荐