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