【发布时间】:2017-10-01 01:25:58
【问题描述】:
我对这种 C 行为有点困惑。如果我在节点之后初始化“头”指针,它似乎不会继续保留下一个元素。示例代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int value;
struct node* next;
} node;
int main(void)
{
node* head = NULL;
node* current = malloc(sizeof(node));
current->value = 1;
if(head == NULL)
head = current;
current = current->next;
current = malloc(sizeof(node));
current->value = 2;
printf("%d\n", current->value); // 2
printf("%d\n", head->value); // 1
printf("%d\n", head->next->value); //Segmentation fault: 11, Should be 2
return 0;
}
据我了解:我 malloc() 内存为当前,然后设置值。然后设置头部等于电流。它们现在都指向同一个节点。
然后我让 current = current->next,malloc 内存并设置值。
为什么 head->next->value 和 current->value 不指向同一个地方?
【问题讨论】:
-
您永远不会在任何地方设置
next。不在当前,不在头脑中。它的值是未定义的,很可能为零。所以你不能尝试取消引用它。 -
'current = current->next;current = malloc(sizeof(node));'看看这两个语句 - 一个肯定是不正确的,因为第二个会覆盖第一个加载的值。
-
@TomKarzes 在我制作“current = current->next”然后 malloc 内存后,我是否不设置“next”?此时,'current->next' 和 'head->next' 不应该是同一个东西吗?
-
@MartinJames
current是一个指针,所以设置current = current->next使current指向current->next指向的位置。之后我分配内存,所以什么都不会被覆盖。 -
@teafellow 当您使用
malloc时,它将选择指针的位置并将其返回给变量。它不会在您的指针当前所在的位置创建内存。这需要事先知道内存在哪里可用。