如何为结构中的动态结构数组分配内存?

How do I allocate memory for dynamic array of structures in a structure?

提问人:wei jong 提问时间:10/7/2023 更新时间:10/7/2023 访问量:71

问:

我有下面的结构,我正在尝试为下面的结构区域分配空间。

目前,我正在为该区域分配空间:

zone *zones = (zone*)malloc(sizeof(zone) + (sizeof(school)*3));

假设我有 3 所学校,每所学校内有 3 场比赛

typedef struct competition { 
    int prize_1;
    int prize_2;
    int prize_3;
} competition;

typedef struct school {
        int school_id;
    competition *competitions;//[Singing, Dancing, Soccer....]
    
} school;

typedef struct zone {
    school *schools; //[School 0, School 1, School 2.....];
} zone;

当我尝试访问时:

school *cs = &(zones->school[0]); //Get the appropriate school
int schoolId = cs->school_id; //get the school id of a school

我收到分段故障错误。我知道我没有为区域正确分配内存,但我不确定如何正确分配内存

c 指针 struct malloc dynamic-arrays

评论


答:

1赞 dbush 10/7/2023 #1

该成员未指向任何位置,因此尝试取消引用该指针会触发未定义的行为schools

您需要首先为区域分配空间,然后为它指向的学校数组分配空间:

zone *zones = malloc(sizeof(zone));
zones->schools = malloc(sizeof(school)*3);

评论

0赞 wei jong 10/7/2023
那么,我是否应该为个别学校的“比赛”分配单独的空间?或者我可以一次为所有学校的所有比赛分配空间吗?你能帮我做同样的事情吗,那真的很有帮助?
0赞 dbush 10/7/2023
@weijong 是的,您还需要分配每个成员指向的空间。competitions
0赞 wei jong 10/7/2023
在这里,我有 3 所学校,那么我是否应该进入每所学校,为每所学校单独分配每场比赛的空间?比如说,我有100所学校,我很难进入每所学校,并在每所学校创造一个竞争空间,对吧?任何建议都值得赞赏!
0赞 dbush 10/7/2023
@weijong 是的,您需要分配每个成员指向的空间。competitions
1赞 0___________ 10/7/2023
1. 我会检查分配是否失败。2.我会在sizeof
1赞 0___________ 10/7/2023 #2

若要使用分配算法,需要尽可能使用灵活的数组成员而不是指针,因为它可以简化分配和解除分配。

  • 请记住也要存储已分配对象的数量。
  • 始终检查分配错误并提供错误处理。
typedef struct competition { 
    int prize_1;
    int prize_2;
    int prize_3;
} competition;

typedef struct school 
{
    int school_id;
    size_t numCompetitions;
    competition competitions[];
    
} school;

typedef struct zone 
{
    size_t numSchools;
    school *schools[];
} zone;

school *allocateSchool(size_t numCompetitions)
{
    school *sch = malloc(sizeof(*sch) + numCompetitions * sizeof(sch -> competitions[0]));
    if(sch) sch -> numCompetitions = numCompetitions;
    return sch;
}

zone *allocateZones(size_t numZones)
{
    zone *zn = malloc(sizeof(*zn) + numZones * sizeof(zn -> schools[0]));
    if(zn) zn -> numSchools = numZones;
    return zn;
}

评论

0赞 Support Ukraine 10/7/2023
OT:对我来说,这个名字令人困惑。我宁愿numZonesnumSchools