如何显示另一个结构的列表的结构?

问题描述 投票:0回答:1

我正在做一个小项目,其中我有一个汽车结构(年份,品牌等。)和一个包含汽车的收藏结构,如何在收藏中显示汽车?

在我的Car.h中,我定义了:

struct CarP;
typedef struct CarP * Car;
typedef const struct CarP * constCar;

Car car_createCopy(constCar c); //returns a copied car from c 
void display_car(constCar c);

在我定义的Collection.h文件中:

struct CollectionP;
typedef struct CollectionP * Collection;
typedef const struct CollectionP * constCol;

和在Collection.c中:

struct CollectionP{
    int nbCars;
    Car * carList;
}

int getNbCars(constCol c){
    return c -> nbCars;
}

void add_car(Collection c, constCar car){
    int nbCar = getNbCars(c);
    if(nbCar == 0)
        c -> carList = malloc(sizeof(car));
    else{
        c -> carList = realloc(c -> carList,(nbCar+1)*sizeof(car));
        c -> carList[nbCar] = car_createCopy(car);
    }
    c -> nbCars++;
}

void display_col(constCol c){
    int nbCar = getNbCars(c);
    for(int i = 0; i < nbCar; i++)
        display_car(c -> carList[i]);
}

在向集合中添加了一些汽车之后,我尝试调用显示函数,我只得到了一辆带有空值的品牌车和其他数字作为其他字段值的汽车,然后程序因分段错误而停止。

c pointers malloc realloc
1个回答
1
投票

这是错误的。 (请参见下面的// HERE):

void add_car(Collection c, constCar car){
    int nbCar = getNbCars(c);
    if(nbCar == 0)
        c -> carList = malloc(sizeof(car));
    else{
        c -> carList = realloc(c -> carList,(nbCar+1)*sizeof(car));
        c -> carList[nbCar] = car_createCopy(car);  // HERE
    }
    c -> nbCars++;
}

标记的那一行是将汽车副本放入列表的责任。但它永远不会在第一次添加时执行。应该将其移动,特别是在else块之后和之外。

void add_car(Collection c, constCar car){
    int nbCar = getNbCars(c);
    if(nbCar == 0)
        c -> carList = malloc(sizeof(car));
    else{
        c -> carList = realloc(c -> carList,(nbCar+1)*sizeof(car));
    }
    c -> carList[nbCar] = car_createCopy(car);  // FIXED
    c -> nbCars++;
}

就是说,其中有很多地方需要进行错误检查,并且realloc的使用应通过一个临时指针,以免丢失分配的列表而导致错误的NULL结果。但是,您的问题的核心是如上所述。

© www.soinside.com 2019 - 2024. All rights reserved.