【发布时间】:2019-10-27 22:21:13
【问题描述】:
我正在做一个小项目,其中我有一个汽车结构(年份、品牌等)和一个包含汽车的集合结构,我如何在集合中显示汽车?
在我的 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]);
}
将一些汽车添加到集合中后,我尝试调用显示函数,我只得到一辆汽车,品牌为 null,其他字段的值不同,然后程序因分段错误错误而停止。
【问题讨论】:
-
仅供参考,在类型别名中隐藏指针类型(在这种情况下为
Car和Collection)不会使代码更易于阅读、理解或维护。只有两种情况可以合法地调用指针类型别名:黑盒“句柄”API,以及回调函数指针原型。在此代码中似乎都没有必要,我敦促您现在或将来不要这样做。 C 程序员希望看到星号;这是我们的天性,我们早餐吃它们。如果一个指针真的是一个指向指针的指针,你想直接看到它。 -
@WhozCraig 是的,我知道这一点,但这是一个大学项目,我必须这样做,但我完全理解你的想法。
-
既然如此,只要您完全了解您的大学正在助长可怕的习惯(不令人震惊),我很高兴听到您更了解。这么坏的习惯。无论如何,就是说,看看你的 first 汽车添加逻辑。第一辆汽车是如何进入收藏的?您所做的只是分配初始指针床;此后不会发生任何分配等。那行
c->carList[nbCar] = car_createCopy(car);应该在c->nbCars增量之前的else 块outside(之后)。只是说。 -
@WhozCraig 我觉得自己好蠢……谢谢