2016-12-03 13 views
0

入力ファイルからどれくらいのメモリを割り当てるべきかを読んでいる間、構造体の配列(子)のためにメモリを割り当てようとしています。これを行う最も賢い方法は何か分かりません。私の構造体:fgets内のstructの配列のメモリを割り当てよう

typedef struct sNaryNode { 
    void* data; // point to each nodes data 
    unsigned int n; // the number of children 
    struct sNaryNode **child; // the child list 
} NaryNode; 

typedef struct { 
    char *name; 
    unsigned int utility; // -1, 0, 1 
    unsigned int probability; // 0-1 
} Child; 

typedef struct { 
    unsigned int level; 
    unsigned int player; 
    unsigned int nChildren; 
    Child *children; // The array of structs I am trying to allocate memory to. 
} Data; 

私は次のことを試してみました:

void readData(Data *node) { 
    FILE *input_file = fopen("data.csv", "r"); 

    if(input_file == NULL) printf("Could not open file\n"); 

    else { 
    char buf[80]; 
    int n = 0; 
     while(fgets(buf, 80, input_file)!= NULL) { 
     // allocate space for new data 
     Data *node = (Data*)calloc(1, sizeof(Data)); 
     sscanf(buf, " %u, %u, %u, ", &node->level, &node->player, &node->nChildren); 
     node->children = calloc(node->nChildren, sizeof *node->children); 
     sscanf(buf, "%u, %u, %s ", &node->children[n].utility, &node->children[n].probability, node->children[n].name); 
     n++; 
    } 
    fclose(input_file); 
    } 
} 

int main(void) { 
    Data *node; 
    readData(node); 
} 

それは私が間違ってメモリ割り当てとは何かを持っている期待してセグメンテーションフォールトになります。私は読んでい

ファイル:

level, player, nChildren, utility, probability,  name 
    1,  1,  2,   1 0,  0.50 0.50,  "Kom med det første tilbud (anchor)" "Afvent modspilleren kommer med første tilbud" 
    2,  2,  2,   1 0,  0.50 0.50,  "Kom med lavt modtilbud (anchor)" 
    2,  2,  2,   1 0,  0.50 0.50,  "Kom med det første tilbud "anchor" 

EDIT:GDBは、セグメンテーションフォルトがて、readDataにおける第二のsscanfラインから来ていることを私に伝えます。まだ原因を突き止めている。

+0

既に与えられた答えを理解できないようにする方法で質問を変更しないでください: -/ – alk

答えて

1

最も問題行はこの1つである:

node->children[n] = *(Child*)calloc(1, sizeof(node->nChildren)); 

node->childrenのためのすべてのあなたの避難所に割り当てられたメモリの第一に、それはあなたがデリファレンスNULLポインタです。次に、間違った量のメモリを割り当てます。第3に、返されたポインタを逆参照してからそれを放棄すると、メモリリークが発生します。

正確には私が知らないすべての問題を解決する方法、あなたが読んでいるファイルについての詳細はありません。しかし、第一および第三の問題は、nameを読んで問題もあります。この

node->children = calloc(node->nChildren, sizeof *node->children); 

ようnode->childrenにメモリを割り当てることによって解決することができます。 1つは、sscanfのフォーマット"%s"のスペースを区切って文字列であることです。第二に、最も深刻なのは、あなたが名前のためのスペースを割り当てないということです。

+0

あなたが言ったように私はちょうど行を修正しました。それは理にかなっている。しかし、問題は持続するようです(まだsegfault 11を取得します)。私が読もうとしているファイルの内容を追加しました。 – asdasd

関連する問題