在fgets中为struct数组分配内存

时间:2016-12-03 10:56:19

标签: c memory 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"

编辑:GDB告诉我,segfault来自readData中的第二个sscanf行。仍然不确定是什么导致它。

1 个答案:

答案 0 :(得分:1)

最有问题的一行就是这一行:

find . -mtime 1 -iname "aml*" -ls | awk '{print $8,$9"\t",substr($11,3,100)"\t",$10"\t",substr($7=$7/(1024^2),1,5)}'

首先,你没有为node->children[n] = *(Child*)calloc(1, sizeof(node->nChildren)); 分配内存,它是一个空指针,你可以取消引用它。其次,您分配了错误的内存量。第三,因为你取消引用返回的指针然后扔掉它会导致内存泄漏。

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

node->children

阅读node->children = calloc(node->nChildren, sizeof *node->children); 时也存在问题。有一点是name格式sscanf读取空格分隔字符串。第二个也是最严重的是你没有为这个名字分配空间。