我正在做一个小项目,其中我有一个汽车结构(年份、品牌等(和一个包含汽车的收藏结构,我如何在收藏中显示汽车?
在我的车里。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;
和收藏。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]);
}
在将一些汽车添加到集合中后,我尝试调用显示功能,我只得到一辆品牌为null、其他字段为不同数字的汽车,然后程序因分段错误而停止。
这是错误的。(见下文// 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
结果。但你的问题的核心是我上面展示的。