我正在做一个小项目,其中有一个汽车结构(年份,品牌等)和一个包含汽车的收藏结构,如何在收藏中显示汽车?
在我的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]);
}
在向集合中添加了一些汽车之后,我尝试调用显示函数,我只得到了一辆带有空值的品牌车和其他数字作为其他字段的值的汽车,然后程序因分段错误而停止。
这是错的。(请参见// 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
导致错误的结果。但是,您问题的核心是如上所述。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句