2016-03-24 13 views
0

ファイルから動的構造体配列にデータを読み込もうとしています。ファイルからデータを読み込んで動的構造体配列を再配置するときのSegfault

1行のデータ(配列サイズ1)では動作するようですが、それ以上の大きさの場合はsegfaultを取得します。私はコーディングではかなり経験がないので、それを引き起こしていることを完全に失っています。

#include <stdio.h> 
#include <stdlib.h> 

typedef struct 
{ 
    int a; 
    int b; 
} Structure; 

void Tester(Structure **Data) 
{ 
    Structure Input; size_t Number = 0; 

    *Data = NULL; 

    FILE *File = fopen("file.txt", "r"); 

    while(2 == fscanf(File, "%d %d", &Input.a, &Input.b)) 
    { 
     printf("Before: %d\n",Number); 

     Number++; 

     Structure *NewInput = realloc(*Data, Number * sizeof(Structure)); 

     *Data = NewInput; 

     printf("After: %d\n",Number); 

     *Data[Number - 1] = Input; 
    } 

    fclose(File); 
} 

int main() 
{ 
    Structure *TestData; 

    Tester(&TestData); 

    printf("%d %d", TestData[0].a, TestData[0].b); 

    return 0; 
} 

それがなかったとき、私が使用したテキストファイルだけでプログラムが働いていた「1 2」、および「1 2 3 4」が含まれていました。ここで

は、関連するコードです。行でエラーoccours:

 *Data[Number - 1] = Input; 

は、だから私はreallocのは、最初のループの後に正常に動作していないという感覚を得ます。すべてのヘルプやアドバイスは大歓迎です! []オペレータは単項*オペレータとa[b]より高い優先順位を有するので

+1

後置演算子は単項演算子よりも高い優先度を持ちます。 '(* Data)[Number-1] =入力; 'を使用してください。 – EOF

+0

@EOF答えとして投稿する – Barmar

+0

'fopen()'が成功したかどうかを確認する必要があります。 – MikeCAT

答えて

1

*Data[Number - 1] = Input; 

これは、それが実際の配列を指す別のポインタへの単一のポインタだポインタの配列としてDataを治療さ

*(Data[Number - 1]) = Input; 

と等価ですStructure。次に、この配列のN番目の要素(実際には存在しない)をInputにコピーする場所として使用します。 Number > 0の場合、これらの他のポインタは初期化されていないため(実際の配列は存在しないため)、失敗します。

正しい構文は次のとおりです。

(*Data)[Number - 1] = Input; 

これは、あなたがに割り当てることができるStructure要素の配列を取得するDataを逆参照します。

+0

なぜこの回答が下降したのですか? – immibis

+0

@immibis私はそれがEOFだと思う、MikeCatの答えに対するコメントで私たちの "議論"を見てください。 – Barmar

+0

私はもともとその回答を下落させましたが、これが非常に賛成であるという事実を踏まえて、私はそれを削除しました。 – Barmar

0

*Data[Number - 1]Data[Number - 1][0]と同等である。また、Data[1]以上が範囲外である*((a) + (b))と同等であるので、*Data[Number - 1] = *(Data[Number - 1]) = *((Data[Number - 1]) + (0)) = [Data[Number - 1][0]

とそれはアクセスされてはならない。

(*Data)[Number - 1]Data[0][Number - 1]に相当します。そのため、操作者の優先順位の

+0

あなたが '*(Data [Number - 1]) 'と同等であると言っても、それほど混乱はないと思います。 – Barmar

+0

なぜ[Data [0] [Number - 1]'と書くのか不明です。 'Data'は配列として使われていないので、配列へのポインタです。 – Barmar

+0

@Barmarここに配列はありません。 – EOF

関連する問題