Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中使用三重指针_C_Multidimensional Array_Fread - Fatal编程技术网

在C语言中使用三重指针

在C语言中使用三重指针,c,multidimensional-array,fread,C,Multidimensional Array,Fread,我知道如何使用for循环将文件读入2d数组,以指示在C中存储数据的位置,但我感兴趣的是,是否可以使用一个fread()调用来实现这一点。也就是说,我可以这样做吗: int A[5][5]; fread(&A, sizeof(int), 25, filePtr); 我得到seg故障时,我尝试了这一点,所以现在,我想知道这是否可以做到 编辑: 好吧,我想这样使用fread并不是我的问题。我的问题是,我必须从函数内部调用fread,而a是在该函数外部定义的 func(int size, in

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

int A[5][5];
fread(&A, sizeof(int), 25, filePtr);
我得到seg故障时,我尝试了这一点,所以现在,我想知道这是否可以做到

编辑: 好吧,我想这样使用fread并不是我的问题。我的问题是,我必须从函数内部调用fread,而a是在该函数外部定义的

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

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

所以我的问题是,我对fread的调用仍然存在seg错误,我必须为我的函数原型使用三个指针。我只是为了好玩而试了一次(而不是*A),但还是犯了同样的seg错误。看起来我只是忽略了一些带有指针的东西。

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

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

在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语言中,把数组看作是指针,它的“值”(内存地址)是不能更改的。它们的所有其他方面实际上是相同的。在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语言中,把数组看作是指针,它的“值”(内存地址)是不能更改的。它们的所有其他方面实际上是相同的。以后它会帮你省去很多麻烦。

我的问题是连续内存的问题。事实上,当你意识到fread只被设置为使用单指针时,这是非常直截了当的。因此,它只能采用一维阵列。但是,如果在内存中连续表示二维数组,则它类似于一维数组。因此,只要给fread传递一个指向二维数组中第一个元素的指针,它就会像一维数组一样开始循环,一切都会好起来

因此,只要确保您的二维阵列是连续分配的,您应该会没事

malloc(n*n *sizeof(int)) 

我的问题是连续内存的问题,而不是对每一行执行一个for循环。事实上,当你意识到fread只被设置为使用单指针时,这是非常直截了当的。因此,它只能采用一维阵列。但是,如果在内存中连续表示二维数组,则它类似于一维数组。因此,只要给fread传递一个指向二维数组中第一个元素的指针,它就会像一维数组一样开始循环,一切都会好起来

因此,只要确保您的二维阵列是连续分配的,您应该会没事

malloc(n*n *sizeof(int)) 

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

是的,它会编译。这个地址存储在某个地方,所以获取该值的地址很简单。是的,它可以编译。那个地址存储在某个地方,所以取那个值的地址很简单。是的,你绝对是对的。看来我的问题是把A传递给函数,而不是调用fread。是的,你说得没错。看起来我的问题在于将A传递给函数,而不是调用fread。有趣的是,我确实理解了指针的含义。当我感到困惑时,指针的行为似乎不是这样。现在我正试图纠正我的想法,这样它们就不再是那样了。再加上它,它就会凝结。有趣的是,我确实理解了指针的意思。当我感到困惑时,指针的行为似乎不是这样。现在我正试图纠正我的想法,这样他们就不会再这样了。再多用它,它就会凝结。