我正在尝试实现一个函数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;
}