2010-10-21 55 views
2

我有制定汽車租賃計劃的任務,該計劃使用鏈接列表來控制可租用的汽車,出租或正在修理中。 '汽車'是一個結構,租賃清單,可用清單和修理清單也是如此。鏈接列表,分配字符數組[C]

繼承人我當前的問題。如果用戶想要提供新車,我們必須將其添加到所有可能的車的列表中,並且我們必須將其添加到可用車的列表中。

我沒有問題將其添加到汽車列表中,但是當我需要將其添加到可用汽車列表中時,出現分段錯誤。

我現在將提供代碼:

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語句進行了一些測試之後,我發現seg fault在這個語句中發生了。

availCur->aCar->idNum[k] = idNum[k]; 

我希望有人能告訴我爲什麼這項任務會導致段錯誤。 我檢查了用戶提供的idNum是好的,它適用於添加到所有車型列表,所以我不知道什麼是錯的。

我很感激幫助!

回答

3

你說得對點故障。
你在這一點上availCur->aCar分配內存正確

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

是一個懸擺指針。接下來,您在這裏取消引用指針

availCur->aCar->idNum[k] 
       ^^ 

並且這會導致崩潰。

要解決此問題,您需要爲汽車物件分配內存,並在開始填充它之前使其指向availCur->aCar

+0

謝謝,我選擇了你選擇的答案,因爲它最簡潔,並且非常直接地回答了問題。 – Blackbinary 2010-10-21 13:23:59

2

您還沒有爲aCar分配任何內存,這是指向car的指針。當您嘗試引用aCar中的字段時,您嘗試訪問根本不存在的內存,因此存在分段錯誤。

取決於你想要什麼可用的車輛列表舉行有一些可能的補救措施。假設您希望可用車列表中的每個條目與所有車輛列表中的條目相對應,您只需將您的aCar場點指向車列表中的現有車輛即可。另一方面,如果您想讓可用的車輛列表保存自己的一組車輛,則需要先爲車輛分配內存,然後將其分配給aCar並填充其字段。

+0

感謝您的幫助,以及對我的選擇的解釋。我正在做後者,因爲這是我在任務中指示的方式。 – Blackbinary 2010-10-21 13:23:19

1

有幾件事情:

  1. 爲什麼你有車的鏈表,和汽車(carcarList)的鏈接列表的鏈接列表?
  2. fprintf(stderr, "...")更適合調試,因爲消息不會被延遲; printf("...")可能會被緩衝,導致程序崩潰時無法獲得最新的輸出。
  3. 在解引用它之前,您沒有分配availCar->aCar。您需要availCar->aCar = (car *)malloc(sizeof(car))才能使用availCar->aCar->...
+0

謝謝,我不知道那個區別。現在將使用fprintf :) – Blackbinary 2010-10-21 13:21:48

1

此代碼:

for(k=0;k<=19;k++) 
{ 
    carCur->idNum[k] = idNum[k]; 
} 

是可怕的,極有可能打破。如果用戶沒有使用包含至少20個有效字符的字符串進行調用,那麼它將面臨崩潰的高風險。你想:

strcpy(carCur->idNum, idNum); 
+0

謝謝,它已經有一段時間了,忘了關於strcpy。 – Blackbinary 2010-10-21 13:21:18

-1

最好是創建一個list類,並把一個構造函數,將分配內存爲aCar件和析構函數來釋放此內存(當然你需要移動到C++這樣做) 。

+0

我不確定這是一個很好的建議。你基本上說'切換到OOP'。這對問題沒有幫助。 – Blackbinary 2010-10-21 15:37:24