我的任务是制定汽车租赁程序,该程序使用链接列表来控制哪些汽车可供出租,已出租或正在维修。 “汽车”是一种结构,租赁列表,可用列表和维修列表也是如此。

这是我当前的问题。如果用户希望提供新车,我们必须将其添加到所有可能的车列表中,并且必须将其添加到可用车列表中。

我将它添加到汽车列表中没有问题,但是当我需要将其添加到可用汽车列表中时,出现了细分错误。

我现在将提供代码:

typedef struct vehicles
{
    char idNum[20];
    int miles;
    int rDate;
    struct vehicles *nextCar;

}car;

typedef struct list
{
    car * aCar;
    struct list *nextCar;
} carList;

所有汽车的清单是:
car * carHead, * carCur;

所有可用汽车的列表是:
carList * availHead, * availCur;

两者都初始化为NULL。

然后,我创建一辆新车,并输入用户给我的数据(里程数和ID号)
carCur = (car *)malloc(sizeof(car));
//set ID, Mileage
for(k=0;k<=19;k++)
{
     carCur->idNum[k] = idNum[k];
}
carCur->miles = miles;
carCur->nextCar = NULL;

这工作得很好。我调用了实际上将其添加到列表中的函数,一切都很好。

然后,我创建一个新的carList结构,将其添加到可用的汽车列表中。
availCur = (carList *)malloc(sizeof(carList));
//set ID, Mileage
for(k=0;k<=19;k++)
{
    availCur->aCar->idNum[k] = idNum[k];
    printf("assigned\n");
}
availCur->aCar->miles = miles;
availCur->nextCar = NULL;

经过一些使用printf语句的测试(为了简洁起见,此处未全部包括在内),我发现此语句中出现了段错误。
    availCur->aCar->idNum[k] = idNum[k];

我希望有人能告诉我为什么此作业会导致段错误。
我检查了用户提供的idNum很好,并且可以添加到所有汽车列表中,因此我不确定这是什么错误。

感谢您的帮助!

最佳答案

您对段错误的观点是正确的。您正在正确分配内存

availCur = (carList *)malloc(sizeof(carList));

此时,availCur->aCar是一个悬空指针。接下来,您在这里取消引用该指针
availCur->aCar->idNum[k]
              ^^

这会导致崩溃。

要解决此问题,您需要在开始填充之前为汽车对象分配内存,并使其指向availCur->aCar

10-01 05:57
查看更多