2016-12-03 37 views
0

我想在为输入文件分配多少内存的同时为结构数组(struct)分配内存。我不确定最明智的做法是什么。我的结构:为fgets中的结构数组分配内存

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" 

编辑:GDB告诉我,该段错误是从READDATA第二sscanf的陆续上马。仍然不确定是什么造成的。

+0

不要改变你的问题的方式,使已经给出的答案不可理解......: -/ – alk

回答

1

最有问题的线是这个:

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

首先你还没分配的内存为node->children,它是一个空指针,取消引用。其次,你分配错误的内存量。第三,由于您取消引用了返回的指针,然后将其丢弃,您将有内存泄漏。

正好如何解决我不知道的所有问题,而不是没有关于您正在阅读的文件的更多细节。但是第一和第三个问题可以通过分配内存node->children来解决这样

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

也有问题读取name。有一件事是sscanf格式"%s"读取空格分隔字符串。第二个也是最严重的是,你没有为这个名字分配空间。

+0

我刚刚修复了你所说的问题。这说得通。然而这个问题似乎仍然存在(仍然是段错误11)。我添加了我正在阅读的文件的内容。 – asdasd