2015-12-19 238 views
0

我試圖實現一個函數makelinkedList,它接受鏈表中的節點數並返回地址。功能printlinkedList打印鏈接列表。爲什麼在這個LinkedList實現中出現分段錯誤

當我實現此代碼時,我不會收到分段錯誤。

#include <stdio.h> 
#include <stdlib.h> 

struct node{ 
    int data; 
    struct node* next; 
}; 

typedef struct node linkedList; 

void printlinkedList(linkedList** head){ 
    linkedList* crawler = *head; 

    while(crawler!=NULL){ 
     printf("%d -> ", crawler->data); 
     crawler= crawler->next; 
    } 
    printf("|NULL|\n"); 
} 

linkedList* makelinkedList(int size){ 

    linkedList* crawler = malloc(sizeof(linkedList)); 
    crawler->data = --size; 
    crawler->next = NULL; 
    linkedList* head = crawler; 
    while(size > 0){ 
     crawler->next = malloc(sizeof(linkedList)); 
     crawler = crawler->next; 
     crawler->data = --size; 
     crawler->next = NULL; 
    } 
    printlinkedList(&head); 
    return head; 
} 

int main(void) { 
    // your code goes here 
    linkedList* node = (makelinkedList(5)); 
    linkedList** head = &node; 
    printf("from main\n"); 
    printlinkedList(head); 
    return 0; 
} 

輸出的代碼的以上給出: - > 3 - > 2 - > 1 - > 0 -

4> | NULL |

但是當我嘗試返回頭部的地址(&頭部)時,我得到了分段錯誤。導致錯誤的代碼如下:

#include <stdio.h> 
#include <stdlib.h> 

struct node{ 
    int data; 
    struct node* next; 
}; 

typedef struct node linkedList; 

void printlinkedList(linkedList** head){ 
    linkedList* crawler = *head; 

    while(crawler!=NULL){ 
     printf("%d -> ", crawler->data); 
     crawler= crawler->next; 
    } 
    printf("|NULL|\n"); 
} 

linkedList** makelinkedList(int size){ 

    linkedList* crawler = malloc(sizeof(linkedList)); 
    crawler->data = --size; 
    crawler->next = NULL; 
    linkedList* head = crawler; 
    while(size > 0){ 
     crawler->next = malloc(sizeof(linkedList)); 
     crawler = crawler->next; 
     crawler->data = --size; 
     crawler->next = NULL; 
    } 

    return &head; 
} 

int main(void) { 
    // your code goes here 
    linkedList** head = (makelinkedList(5)); 
    printf("from main\n"); 
    printlinkedList(head); 
    return 0; 
} 

爲什麼我不能返回頭的地址?

+1

地方(而不是靜態)指針變量的地址不是範圍的有效之外。 – BLUEPIXY

+1

你的代碼的第一個版本很好..沒有必要混亂它。儘管你可以傳遞一個單一深度的指針到'print'。 –

回答

3

head是一個局部變量。當包含它們的函數返回時,局部變量被銷燬。

因此在makelinkedList返回後,您的「指向head」的指針不再指向head,因爲它不存在。通常情況下,局部變量一旦被銷燬就會被相當快地覆蓋,因爲所有局部變量在內存中共享相同的空間(「堆棧」)。當你嘗試使用指針到head時,該空間不再包含head包含的內容,但已被重用來存儲其他內容。

0

正如immibis在他的回答中所解釋的那樣,您不能返回局部變量的地址。但好的新功能是你不需要返回地址,返回head的值就是你所需要的。 head是指向列表的第一個元素的指針,它攜帶所有需要的信息。

事實上,你可以簡單地通過headprintLinkedList,並簡化爲ljst取指針而不是指針指針。

造成混淆的真正原因是typedef struct node linkedList。 linkedList應該只是一個指向第一個節點的指針,但typedefing指針類型更令人困惑。您可以在您的所有功能,使用更簡單的類型定義和使用指針節點:

#include <stdio.h> 
#include <stdlib.h> 

struct node { 
    int data; 
    struct node *next; 
}; 

typedef struct node node; 

void printlinkedList(node *head) { 
    node *crawler = head; 

    while (crawler != NULL) { 
     printf("%d -> ", crawler->data); 
     crawler = crawler->next; 
    } 
    printf("|NULL|\n"); 
} 

node *makelinkedList(int size) {   
    node *crawler = malloc(sizeof(node)); 
    crawler->data = --size; 
    crawler->next = NULL; 
    mode *head = crawler; 
    while (size > 0) { 
     crawler->next = malloc(sizeof(linkedList)); 
     crawler = crawler->next; 
     crawler->data = --size; 
     crawler->next = NULL; 
    }  
    return head; 
} 

int main(void) { 
    node *head = makelinkedList(5); 
    printf("from main\n"); 
    printlinkedList(head); 
    return 0; 
} 
相關問題