c-为什么在LinkedList的这个实现中会出现分段错误



我正在尝试实现一个函数makelinkedList,它接受链表中的节点数并返回的地址。函数printlinkedList打印链接列表。

当我实现这个代码时,我不会遇到分段错误。

#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 mainn");
    printlinkedList(head);
    return 0;
}

上面给出的代码的输出:

4->3->2->1->0->|NULL |

但是当我试图返回head(&head)的地址时,我得到了一个分段错误。导致故障的代码如下所示:

#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 mainn");
    printlinkedList(head);
    return 0;
}

为什么我不能返回校长的地址?

head是一个局部变量。当包含局部变量的函数返回时,局部变量将被销毁。

因此,在makelinkedList返回后,您的"指向head的指针"不再指向head,因为它不存在。通常,局部变量一旦被销毁,就会很快被覆盖,因为所有局部变量在内存中共享相同的空间("堆栈")。当您尝试使用指向-head的指针时,该空间不再包含head所包含的内容,而是被重新用于存储其他内容。

正如immibis在他的回答中所解释的,您不能返回局部变量的地址。但好的新方法是,您不需要返回地址,只需要返回head的值。head是指向列表的第一个元素的指针,它携带所需的所有信息。

事实上,在将head简化为ljst而不是指向指针的指针后,您也可以将其传递给printLinkedList

造成混乱的真正原因是typedef struct node linkedList。linkedList实际上应该只是指向第一个节点的指针,但类型定义指针类型更令人困惑。您可以使用更简单的typedef,并在所有函数中使用指向节点的指针:

#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 mainn");
    printlinkedList(head);
    return 0;
}

相关内容

  • 没有找到相关文章

最新更新