[英]Why does my linked list head point to 2 items before the head
所以我試圖以非全局形式練習我的C雙指針鏈接列表,並且我感到困惑,為什么s(實際上是頭)先指向null,然后再指向一些隨機地址,即使我認為我將其移至列表中的第一個節點。
這是我的代碼:
typedef struct nodeStruct{
int item;
struct nodeStruct *next;
} Statistician;
void add(Statistician **s, int x);
void displayData(Statistician **s);
int main(int argc, char *argv[]) {
Statistician *s = NULL;
add(&s, 3);
add(&s, 4);
add(&s, 5);
add(&s, 6);
add(&s, 7);
add(&s, 8);
add(&s, 9);
displayData(&s);
return 0;
}
void add(Statistician **s, int x){
Statistician *temp = malloc(sizeof(Statistician));
temp->item = x;
temp->next = NULL;
if(s == NULL){
s = &temp;
}
else{
Statistician *travel = s;
while(travel->next!=NULL){
travel = travel->next;
}
travel->next = temp;
}
}
void displayData(Statistician **s){
Statistician *temp = s;
printf("List is: ");
while(temp!=NULL){
printf("%d ", temp->item);
temp = temp->next;
}
}
我從代碼中獲得此輸出,並且也收到以下警告: List is: 0 43586480 3 4 5 6 7 8 9
[警告]在代碼行中從不兼容的指針類型初始化(默認情況下啟用)[默認]統計信息* travel = s
在打印數據之前,我總是可以將displaydata移動兩次,這樣我不想看到的第一個數據就不會消失,但是我想知道為什么它會那樣工作。 我也可以忽略這些錯誤,但我想學習如何解決。
[警告]從不兼容的指針類型初始化(默認情況下啟用),此行代碼統計師* travel = s
這表示您正在分配不兼容的指針類型。
if(s == NULL){
s = &temp;
}
這里s
並不指向您的head
, *s
是。 所以應該
if(*s == NULL){
*s = temp;
}
然后
Statistician *travel = s;
再次應該
Statistician *travel = *s;
然后在displayData()
void displayData(Statistician **s){
Statistician *temp = *s;
該代碼邏輯錯誤。 你沒有用s
正確。 就像那樣。 您之前的操作沒有做任何重要的事情。 您對局部變量進行了一些錯誤的更改,並將單個指針值分配給了一個雙指針。
void add(Statistician **s, int x){
Statistician *temp = malloc(sizeof(Statistician));
temp->item = x;
temp->next = NULL;
if(*s == NULL){
*s = temp; //<---change
}
else{
Statistician *travel = *s; //<--change
while(travel->next!=NULL){
travel = travel->next;
}
travel->next = temp;
}
}
您需要通過檢查其retyurn值來檢查malloc
調用是否失敗。 當呼叫失敗時,這將使您免於未定義的行為。
另外displayData
函數也是錯誤的。 這將是
void displayData(Statistician **s){
Statistician *temp = *s; //<---change
printf("List is: ");
while(temp!=NULL){
printf("%d ", temp->item);
temp = temp->next;
}
}
之前,您有未定義的行為來訪問您甚至未分配的內存,或者您沒有權限。 這在您的代碼中調用了Undefined行為。
在這里,當您傳遞&s
則意味着正在發送s
地址,類型為Statistician**
的局部變量將保存該地址。 現在,如果不取消引用它,則只需使用本地變量中包含的s
的地址即可。 這不是您想要的。 您需要更改要傳遞的地址。 因此,您可以通過取消引用*s = temp
實現它,就像這樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.