结构数组的动态内存分配

时间:2019-12-29 15:23:57

标签: c arrays memory-management dynamic-memory-allocation

所以我一直在从事我的一个小项目,但在这一阶段我陷入了困境。我一直在遭受Segfaults的困扰,而且我感到绝望。我有2个结构

typedef struct {
    float time;
}Race;

typedef struct {
    char DriverName[50];
    int NoRaces;
    Race *races;
}Driver;

,在给定每个驱动程序的比赛数量之后,我必须为单个驱动程序分配内存,然后为一系列驱动程序分配内存。到目前为止,这是我的代码

Driver *allocDriver(int noRaces) {
    Driver *driver;
    driver = (Driver *)malloc(sizeof(Driver));
    driver->NoRaces = noRaces;
    driver->races = (Race *)malloc(sizeof(Race));       

    return driver;}


Driver **allocDrivers(int driversNo, int *driversRacesNo) {
    int i;
    Driver **drivers;
    drivers = (Driver **)malloc(driversNo * sizeof(Driver *));
    for(i = 0; i < driversNo; i++)
        drivers[i] = allocDriver(driversRacesNo[i]);

    return drivers;}

2 个答案:

答案 0 :(得分:0)

尽管我不确定,因为我不知道如何从main调用这些名称,也不知道分配的内容;我怀疑您需要更改以下行;

driver->races = (Race *)malloc(sizeof(Race));

喜欢:

driver->races = (Race *)malloc(noRaces * sizeof(Race));

例如,您的代码将5个种族存储,但没有为struct Race分配5个内存空间(我认为,此结构用于种族结果);目前,它只分配一个struct Race的内存宽度。

答案 1 :(得分:0)

这是在ubuntu 18.04上编译的有关结构表分配的“扩展”但简单示例。希望它能自我解释和说明。对于将来的开发和练习,请尝试使用链表代替数组。

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
    name: 'grdFilter'
})
export class GrdFilterPipe implements PipeTransform {
    transform(items: any, filter: any, defaultFilter: boolean): any {
        if (!filter) {
            return items;
        }

        if (!Array.isArray(items)) {
            return items;
        }

        if (filter && Array.isArray(items)) {
            const filterKeys = Object.keys(filter);

            if (defaultFilter) {
                return items.filter(item =>
                    filterKeys.reduce((x, keyName) =>
                        (x && new RegExp(filter[keyName], 'gi').test(item[keyName])) || filter[keyName] === '', true));
            } else {
                return items.filter(item => {
                    return filterKeys.some((keyName) => {
                        return new RegExp(filter[keyName], 'gi').test(item[keyName]) || filter[keyName] === '';
                    });
                });
            }
        }
    }
}