在C中使用三重指针上的fread

时间:2012-10-04 00:50:24

标签: c multidimensional-array fread

我知道如何使用for循环将文件读入2d数组,以指示在C中存储数据的位置,但我感兴趣的是如果你可以使用一个fread()调用来执行此操作。也就是说,我可以这样做:

int A[5][5];
fread(&A, sizeof(int), 25, filePtr);

我现在尝试这样做时遇到了段错误,所以我很想知道是否可以这样做。

编辑: 好吧,我猜这种方式使用fread并不是我的问题。我的问题是我必须从函数内部调用fread,并且在该函数之外定义A.

func(int size, int ***A)
{
  fread(*A, sizeof(int), size*size, filePtr);
}

main
{
  int A[n][n];
  func(n, &A);
}

所以我的问题是我对fread的调用仍然存在错误,我必须使用三重指针作为我的函数原型。我尝试了A(而不是* A)来获得乐趣,但仍然遇到了同样的错误。看起来我只是用指针忽略了一些东西。

3 个答案:

答案 0 :(得分:2)

A已经是指向数组的指针。 &A是指向此指针的指针,这不是您想要的。您需要做的就是将&A替换为A

答案 1 :(得分:1)

在C中考虑数组的最佳方法是除了在一个前面之外与指针同义:您不能像常规指针那样更改它们引用的地址。例如:

int A[5][5];
int *aptr = A;  // notice no &

aptr += 2; // works fine.
A += 2;    // does NOT compile.

同样......

int A[5][5];
fread(A, sizeof(int), 25, filePtr); // again, note no &

这......

int A[5][5];
int *aptr = A;
fread(aptr, sizeof(int), 25, filePtr); // no & here either.

最终都会向fread()发送相同的地址。

同样,在C中,将数组视为指针,你无法改变“值”(内存地址)。它们的所有其他方面几乎相同。它会在以后为您节省很多麻烦。

答案 2 :(得分:0)

我的问题是连续的记忆。当你意识到fread只设置为采用单指针时,它实际上是非常直接的。因此它只能采用1-d阵列。但是,如果您的2-d数组在内存中连续表示,则类似于1-d数组。因此,只需将指针传递给指向二维数组中第一个元素的指针,它就会开始循环遍历它,好像它是一维数组一样,一切都很好。

因此,只需确保您的二维数组是连续分配的,您应该没问题。

malloc(n*n *sizeof(int)) 

而不是在每行的for循环中进行mallocing。