【问题标题】:How to display a structure of a list of another structure?如何显示另一个结构的列表的结构?
【发布时间】: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,其他字段的值不同,然后程序因分段错误错误而停止。

【问题讨论】:

  • 仅供参考,在类型别名中隐藏指针类型(在这种情况下为CarCollection不会使代码更易于阅读、理解或维护。只有两种情况可以合法地调用指针类型别名:黑盒“句柄”API,以及回调函数指针原型。在此代码中似乎都没有必要,我敦促您现在或将来不要这样做。 C 程序员希望看到星号;这是我们的天性,我们早餐吃它们。如果一个指针真的是一个指向指针的指针,你想直接看到它。
  • @WhozCraig 是的,我知道这一点,但这是一个大学项目,我必须这样做,但我完全理解你的想法。
  • 既然如此,只要您完全了解您的大学正在助长可怕的习惯(不令人震惊),我很高兴听到您更了解。这么坏的习惯。无论如何,就是说,看看你的 first 汽车添加逻辑。第一辆汽车是如何进入收藏的?您所做的只是分配初始指针床;此后不会发生任何分配等。那行c-&gt;carList[nbCar] = car_createCopy(car); 应该在c-&gt;nbCars 增量之前的else 块outside(之后)。只是说。
  • @WhozCraig 我觉得自己好蠢……谢谢

标签: c pointers malloc realloc


【解决方案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 结果。但是你的问题的核心正如我上面所展示的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多