C语言链表基础架构疑问及双节点链表代码正确性咨询
C语言链表新手问题解答
背景
我是C语言新手,想要实现链表,参考了一段初始代码:
#include <stdio.h> #include <stdlib.h> typedef struct Node { int data; // integer data struct Node* next; // pointer to the next node } Node; int main() { Node* A = NULL; Node* temp = malloc(sizeof * temp); temp->data = 2; temp->next = NULL; A = temp; printf("%d", A); return 0; }
我已理解指针基本用法,比如:
//Example 2 int a = 2; int* p = &a;
即p存储a的地址,*p存储a的内容。
疑问解答
1. 为什么Node* A = NULL;无法像示例2那样访问地址和内容?
A本身是一个指针变量,它有自己的地址,可以通过&A访问,比如执行printf("%p", &A);就能打印出A这个变量在内存中的地址。- 但
A的值是NULL,表示它指向的是一块无效的内存地址,所以不能解引用A来访问它指向的内容(比如A->data或者*A),这会触发未定义行为(程序崩溃或异常)。 - 如果要访问
A指向的内容,必须先让A指向一块有效的内存(比如通过malloc分配的结构体空间,或者指向一个已定义的Node变量)。
2. A = temp到底完成了什么赋值?
A和temp都是Node*类型的指针变量:
temp里存储的是malloc分配出来的那个Node结构体的内存地址。A = temp就是把temp中存储的地址值直接复制给A,让A和temp指向同一块内存空间。- 这块内存空间里已经存了
data=2和next=NULL,所以通过A访问时,A->data就是这块内存的data值,A->next就是这块内存的next值——并不是A->next存temp的地址,而是A本身和temp指向同一个节点。
代码正确性检查
你写的双节点链表代码有错误:
#include <stdio.h> #include <stdlib.h> typedef struct Node { int data; // integer data struct Node* next; // pointer to the next node } Node; int main() { Node* A = NULL; Node* temp = malloc(sizeof * temp); temp->data = 2; temp->next = NULL; A->next = temp; // 这里出错:A是NULL,解引用空指针会导致未定义行为 Node* temp1 = malloc(sizeof * temp1); temp1->data = 3; temp1->next = NULL; temp->next = temp1; return 0; }
错误原因:A初始化为NULL,A->next是对空指针的解引用,这是非法操作,会导致程序崩溃或异常。
修正后的代码
#include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node* next; } Node; int main() { Node* A = NULL; // 创建第一个节点 Node* temp = malloc(sizeof * temp); temp->data = 2; temp->next = NULL; A = temp; // 让A指向第一个节点(作为链表头) // 创建第二个节点 Node* temp1 = malloc(sizeof * temp1); temp1->data = 3; temp1->next = NULL; temp->next = temp1; // 让第一个节点的next指向第二个节点 // 打印验证链表 Node* current = A; while (current != NULL) { printf("%d ", current->data); current = current->next; } // 释放内存,避免泄漏 free(temp1); free(temp); return 0; }
内容的提问来源于stack exchange,提问作者v_head
相关产品推荐
相关产品推荐

