从二进制文件中读取2维数组并返回该数组的指针(使用C语言)

3
我正在尝试编写一个函数,以返回从二进制文件中读取的2D数组指针。虽然我没有编译错误,但当我尝试打印数组中的元素时,总是出现分段错误。这是我的代码:
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; 
}

你忘记使用free()释放你使用malloc()动态分配的内存了。 - Michi
3
myArray不是一个连续的内存区域,每次分配都可能返回指向空闲空间的任何指针。请参见例如我以前的这个答案,了解数组和指向指针的“矩阵”之间的区别。 - Some programmer dude
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Øystein Schønning-Johansen
2个回答

2

问题在于你的代码中没有2D数组。指向指针的查找表并不是2D数组。它是[行数]个散布在堆上随机位置的片段。因此,它也是不必要地慢。

此外,你应该将内存分配和算法分开。

可以尝试使用以下方式:

#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个项目。数组指针也不例外,因此您可以获得1D数组编号n。

非常感谢,您的解释非常好! - LAM

1
你的fread()调用正在覆盖所有你费力设置的指针。
你需要一次只读取一行,并使用已设置的指针进行存储:
for(size_t i = 0; i < rows; ++i)
  fread(myArray[i], cols * sizeof *myArray[i], data);

此外,在进行输入输出和内存分配时,当然也应该检查返回值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接