我正在尝试为结构数组(子元素)分配内存,同时读取应从输入文件中分配多少内存。我不确定最聪明的方法是什么。我的结构:
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行。仍然不确定是什么导致它。
答案 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
读取空格分隔字符串。第二个也是最严重的是你没有为这个名字分配空间。