0

我知道如何使用 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),但仍然遇到相同的段错误。看起来我只是用指针忽略了一些东西。

4

3 回答 3

2

A已经是指向数组的指针。&A是指向这个指针的指针,这不是你想要的。您需要做的就是替换&AA.

于 2012-10-04T00:52:20.030 回答
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 中,将数组视为指针,您无法更改其“值”(内存地址)。它们的所有其他方面几乎相同。它会在以后为您省去很多麻烦。

于 2012-10-04T04:13:06.920 回答
0

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

所以只要确保你的二维数组是连续分配的,你应该没问题。

malloc(n*n *sizeof(int)) 

而不是在 for 循环中为每一行分配。

于 2012-10-14T19:53:05.563 回答