【问题标题】:Allocating memory for array of struct in fgets为 fgets 中的结构数组分配内存
【发布时间】:2016-12-03 10:56:19
【问题描述】:

我正在尝试为结构(子)数组分配内存,同时读取应该从输入文件分配多少内存。我不确定最聪明的方法是什么。我的结构:

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 行。仍然不确定是什么原因造成的。

【问题讨论】:

  • 不要以使已经给出的答案无法理解的方式更改您的问题...:-/

标签: c memory struct


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 我刚刚按你说的修好了线路。这说得通。但是问题似乎仍然存在(仍然出现段错误 11)。我添加了我要读取的文件的内容。
猜你喜欢
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
相关资源
最近更新 更多