c - 从二进制文件读取二维数组并返回该数组的指针(在C中)

标签 c arrays pointers fread

我正在尝试编写一个函数,该函数返回从二进制文件读取的二维数组的指针。尽管我编译时没有错误,但当我尝试打印数组的元素之一时,总会出现段错误。这是我的代码:

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/

相关文章:

c - #define 中的数组

c - 为什么我的 wc 实现差了一个字?

c - 排列数组中的数字

c - 修改代码以通过引用传递

c - 通过引用修改结构与其他指针之间的区别

c - 增加 mqueue 消息大小后无法创建多线程

c - Linux内核无线设备驱动

javascript - 如何根据javascript中嵌套数组的长度对对象数组进行排序

python - 使用 bool 数组掩码,将 False 值替换为 NaN

c - Sizeof 指针与它在 printf 中的表示不同?