我正在尝试输出并输入二维数组的二维数组。
我的二维数组包含在以下结构中
typedef struct matrep {
unsigned rows, columns;
double *data;
} MATRIX;
我创建了以下函数来输出整个结构
void matrix_writebinary(MATRIX *mat,FILE *fp)
{
int a=mat->rows,b=mat->columns;
fwrite(&a,sizeof(int),1,fp);
fwrite(&b,sizeof(int),1,fp);
fwrite(mat->data,sizeof( double ) * a * b,1,fp);
rewind(fp);
}
和以下函数输入结构
MATRIX *matrix_readbinary(MATRIX *mat,FILE *fp)
{
MATRIX matrix;
MATRIX *ptr;
ptr=&matrix;
int a,b;
double *tempptr=ptr->data;
fread(&a,sizeof(int),1,fp);
fread(&b,sizeof(int),1,fp);
for ( int i=0; i < a; i++ )
{
for ( int j=0; j < b; j++ )
{
double value=0.0;
fread(&value,sizeof(double),1,fp);
*(tempptr++)=value;
}
}
rewind(fp);
matrix.rows=a;
matrix.columns=b;
return(ptr);
}
我已检查mat->rows
和mat->columns
是否已使用printf
函数正确输入和输出,但是当它到达该行时
*(tempptr++)=value;
代码中的我得到一个分段错误,它告诉我,我的指针很混乱。 我不认为问题在于打开关闭或操作函数之外的文件,因为我已经完全输出文件并用fprintf和fscanf输入。
有人可以帮我解决问题吗?
答案 0 :(得分:4)
您尚未为数据分配任何内存。您需要添加分配:
ptr->data = malloc(sizeof(double) * ptr->rows * ptr->columns);
double *tempptr = ptr->data;
/* ... */
而且,你不能归还临时的地址!因此矩阵本身也需要动态分配:
MATRIX * ptr = malloc(sizeof(MATRIX));
您可以直接读入&ptr->rows
和&ptr->columns
,无需中间变量。您也可以一次性阅读所有数据。
全部放在一起:
MATRIX *matrix_readbinary(FILE * fp)
{
MATRIX * ptr = malloc(sizeof(MATRIX));
fread(&ptr->rows, sizeof(unsigned int), 1, fp)
fread(&ptr->columns, sizeof(unsigned int), 1, fp)
ptr->data = malloc(sizeof(double) * ptr->rows * ptr->columns);
fread(ptr->data, sizeof(double), ptr->rows * ptr->columns, fp)
return ptr;
}
我不建议传入MATRIX
指针,因为这需要你提供一些不带分配数据存储器的半成品矩阵结构,而且你将承担责任噩梦。
不要忘记相应的清理功能:
void matrix_free(MATRIX * mat)
{
free(mat->data);
free(mat);
}