0

forループを使用してファイルを2次元配列に読み込み、Cでデータを保存する場所を指示する方法を知っていますが、私が興味を持っているのは、これを行うためにfread()呼び出しを1回使用できるかどうかです。つまり、次のようなことができますか。

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 への呼び出しがまだ seg fault であり、関数プロトタイプにトリプル ポインターを使用する必要があることです。楽しみのために(* Aの代わりに)Aだけを試しましたが、それでも同じセグフォルトが発生しました。ポインターで何かを見落としているようです。

4

3 に答える 3

2

Aはすでに配列へのポインタです。&Aこのポインターへのポインターですが、これは必要なものではありません。&Aに置き換えるだけですA

于 2012-10-04T00:52:20.030 に答える
1

Cで配列を考える最良の方法は、1つの面を除いて、ポインターと同義です。通常のポインターのように、それらが参照するアドレスを変更することはできません。例えば:

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が単一のポインターを取るように設定されているだけであることに気付いたとき、それは実際には非常に簡単です。したがって、1次元配列しか使用できません。ただし、2次元配列がメモリ内で連続して表される場合は、1次元配列に類似しています。したがって、freadに2次元配列の最初の要素へのポインターを渡すだけで、1次元配列であるかのようにループが開始され、すべてがうまくいきます。

したがって、2次元配列が連続して割り当てられていることを確認してください。問題がないはずです。

malloc(n*n *sizeof(int)) 

各行のforループでmallocする代わりに。

于 2012-10-14T19:53:05.563 に答える