我正在尝试编写一个函数,该函数返回从二进制文件读取的二维数组的指针。尽管我编译时没有错误,但当我尝试打印数组的元素之一时,总会出现段错误。这是我的代码:
double ** readArray(int rows, int cols)
{
int i;
double **myArray=malloc(rows*sizeof(double*));
if (myArray){
for (i=0; i < rows; i++)
{
myArray[i]=malloc(cols*sizeof(double));
}
}
FILE *data;
data=fopen("matrix.bin", "rb");
fread(myArray,sizeof(double),rows*cols,data);
return myArray;
}
int main ()
{
int cols = 7;
int rows = 15;
double **myArray=readArray(rows, cols);
printf("%f\n", myArray[1][0]);
return 0;
}
最佳答案
问题是您的代码中没有二维数组。指针到指针查找表并不是一个二维数组。它是分散在堆上随机位置的段数[行]。因此它也不必要地缓慢。
此外,您应该将内存分配和算法分开。
做这样的事情:
#include <stdio.h>
#include <stdlib.h>
void* allocArray (int rows, int cols)
{
return malloc( sizeof(double[rows][cols]) ); // allocate 1 2D-array
}
void readArray (int rows, int cols, double array[rows][cols])
{
FILE *data;
data=fopen("matrix.bin", "rb");
fread(array, sizeof(double[rows][cols]), 1, data); // read 1 2D-array
}
int main ()
{
int cols = 7;
int rows = 15;
double (*myArray)[cols] = allocArray(rows, cols);
readArray(rows, cols, myArray);
printf("%f\n", myArray[1][0]);
free(myArray); // free 1 2D-array
return 0;
}
使用特殊声明 double (*myArray)[cols]
而不是更符合逻辑的 double (*myArray)[rows][cols]
的原因是我们希望避免不方便的数组指针取消引用语法。 (*myArray)[1][0]
不容易阅读。因此,不要声明指向 2D 数组的数组指针,而是声明指向 1D 数组的数组指针,然后在该数组指针上使用指针索引。对于任何指针,any_pointer[n]
给出指向的项编号 n。数组指针没有区别,所以你得到一维数组编号n。
关于c - 从二进制文件读取二维数组并返回该数组的指针(在C中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35599371/