c - 创建链表时不需要创建实际节点吗?

标签 c pointers data-structures struct linked-list

我正在研究来自 this article. 的链表

本教程的作者从不创建实际的节点,而只创建节点类型的指针变量,如您在以下代码中所见...

struct node* head = NULL;
struct node* second = NULL;
struct node* third = NULL;

然后他在堆中为它们分配空间...

head = (struct node*)malloc(sizeof(struct node)); 
second = (struct node*)malloc(sizeof(struct node));
third = (struct node*)malloc(sizeof(struct node));

他为什么不创建实际节点?代码应该看起来像这样......

struct node head;
struct node second;
struct node third;

如果我的知识是正确的(如果我错了请纠正我)。简单地声明指针变量不会创建实际变量(在链表的情况下为节点),因此不能像文章中使用代码的教程作者那样取消引用

head->data = 1;

我的意思是,如果这行得通,那为什么行不通呢?

int *a;
a=5;
printf("%d",*a);

显然,上面的代码并没有输出5。

这意味着需要创建另一个变量,然后需要声明变量的地址存储在指针变量中,然后才能对其进行解引用...就像下面的代码...

int *a;
int b=5;
a=&b;
printf("%d",*a);

这输出 5。

那么作者是如何逃避不创建节点的呢?他只是简单地创建指针变量,然后简单地取消对它们的引用....

最佳答案

节点在堆中,这就是 malloc 的作用。

用不用链表的代码来解释,类似于:

int *a = NULL;
a = malloc(sizeof(int));
*a = 5;
printf("%d",*a);

关于c - 创建链表时不需要创建实际节点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25966051/

相关文章:

c - 为什么 "env"的地址在顺序函数调用中不同?

c - 如果我在 fopen() 失败时使用 fclose() 会发生什么(可能)

c - 为什么在main中需要一个while循环来调用arduino UNO中的ISR?

c - 我们可以读取并错误注入(inject)另一个线程的程序计数器吗?

c - 内存分配如何在不显式分配的情况下为 char* 工作

c++ - 在两个相同类的指针之间进行转换的安全性?

data-structures - 使用交换!更新 Clojure(Script) 原子中的 map 向量

c - 将指针的地址分配给指针到指针

python - 斐波那契调用图中的值分区(调用图是二叉树)

c# - 行走时的最短路径 x 唯一节点