首页 > 解决方案 > 解决结构数组及其中的 realloc 的一些建议

问题描述

我有一个结构

struct object{
    double x, y, size;
    int ident;
}

和功能

int object_read_from_file(struct object* s, FILE* f);

它从 .txt 文件的一行中读取一些数据并将其保存在 struct 对象中。Pe:“0.1894 0.3442 0.9 26”可能是 .txt 文件的一行。这都在文件“object.c”中。
在文件“main.c”中,我现在必须实现,从一个大 .txt 文件中读取所有对象,其中包含许多(在程序启动之前不知道)名称为“arg [3]”的行,并将它们保存在一个数组中“对象”按照它们被读入的顺序。我的第一次尝试是这样的:

FILE* f = fopen(arg[3], "r");
struct object s;
int x = 0;
s* objects;
objects = calloc(1, sizeof(struct object));

while(object_read_from_file(&s, f) !=0)
{
    objects[x].x = s->x;
    objects[x].y = s->y;
    objects[x].size = s->size;
    objects[x].ident = s->ident;
    objects = realloc(objects, ((x+1) * (sizeof(struct object))));
    x++;
}
fclose(f);

我知道这里没有保存到我的数组“对象”中。那是因为我现在在编译时已经有多个错误,比如“->”是一个无效的类型参数并且“对象”是未声明的。我完全不知道我做错了什么,我很想得到一些帮助,或者或者更好地了解以另一种方式解决任务的方法,而不是我的方式。

标签: carraysstruct

解决方案


代码必须是:

FILE* f = fopen(arg[3], "r");
struct object s;
int x = 0;
struct object * objects = malloc(0);

while(object_read_from_file(&s, f) !=0)
{
    objects = realloc(objects, ((x+1) * (sizeof(struct object))));
    objects[x].x = s.x;
    objects[x].y = s.y;
    objects[x].size = s.size;
    objects[x].ident = s.ident;
    x++;
}
fclose(f);

第一个malloc在这里允许之后重新分配,并且必须在重新分配之前完成以保存新条目。当然因为s不是指针->必须替换为.

如果最好在fopen之后检查f是否为NULL

考虑到对象的定义,您可以使用memcpys设置新条目


推荐阅读