2009-09-01 8 views
2

私はCを使用しています。fscanf関数のポインタの使用に問題があります。私がしようとすると:fscanfのポインタに関する質問

int *x; 
/* ... */ 
fscanf(file, "%d", x[i]); 

私のコンパイラは私に、コードちょうど私が「Water.exeは動作を停止しました」というメッセージが表示されます(実行されません「形式の引数はポインタではありません」と言って警告を与えます)。 xを* xに置き換えると、コンパイルされません...これは単なる構文上の問題ですか?

+0

「...」で重要なことが起こっていると思われます。あなたがそれを行うために得ることができる最小限のプログラムの完全版をあなたに教えてください。それはプログラムをコピーし、エラーを取り除きながら可能な限り削除します。 – dmckee

+0

また、そのversinoに何をしたいかを明記してください。あまりにも多くの "動作しません"。 –

+1

'* x'と' x [i] 'はどちらも' int'型であり、 'fscanf(file、"%d "...)によって期待通りに' int * '型ではありません。ですから、これは基本的に構文エラーです。 'fscanf(file、"%d "、&x [i])'またはそれに相当する 'fscanf(file、"%d "、)と書いたければ、 x + i) 'となる。 – RBerteig

答えて

11

、次の操作を行います。

int x; 
fscanf(file, "%d", &x); 

あなたがしたい場合は、動的に割り当てられた変数に単一の整数を読むためにこれを行うことができます:

int *x = malloc(sizeof(int)); 
fscanf(file, "%d", x); 
あなたが整数の配列をしたい場合は

、次の操作を行います。

int *x = malloc(sizeof(int) * DESIRED_ARRAY_SIZE); 
fscanf(file, "%d", &x[i]); 

%dintへのポインタを想定していますが、x[i]intなので、address-of演算子(unary &)を使用してリスト要素のアドレスを取得する必要があります。

+1

+1私はOPの混乱の原因と思われる配列要素のアドレスを示すサンプルを含めています。 – RBerteig

8

結果にはスペースを割り当てる必要があります。あなたは、単一の整数を読みたい場合は

int *x; // declares x 

x = malloc(600000 * sizeof(int)) // and allocates space for it 

for (int i = 0; i < 600000; ++i) { 
    fscanf(file, "%d", &x[i]); // read into ith element of x 
} 
+0

私は次のようにしてスペースを割り当てようとしました: x =(int *)calloc(600000、sizeof(int)); しかし、それでも動作しません... – wolfPack88

+2

あなたが表示するものは正しい方法ですが、これはOPが間違っていることを説明するためのものです:int * x; x = malloc(sizeof(int)); fscanf(ファイル "%d"、x);うまくいくでしょう。 –

+1

OPが値を 'x [i]'に読み込もうとしているので、彼は配列を一つの 'int'ではなく欲しいと思います。 –