我看到一些类似的话题,但他们没有帮助我。我制作了链表,以及插入元素的功能。
struct node{
int data;
struct node* next;
} node;
struct node* head;
void insert(struct node* head,int x);
int main(){
struct node* head = (struct node*) malloc(sizeof(struct node));
int x;
while(1){
printf("Please enter number\n");
scanf("%i", &x);
insert(head,x);
print(head); // function that works
}
return 0;
}
void insert(struct node* head,int x){
struct node* temp = malloc(sizeof(struct node));
temp->data = x;
temp->next = NULL;
if(head->next != NULL) temp->next = head;
head = temp;
free(temp);
}
GDB说我在使用if构造的线路上遇到了分段错误:
if(head->next != NULL) temp->next = head;
我的错误在哪里?
答案 0 :(得分:0)
在致电head
之前,您需要先检查if(head->next != NULL) temp->next = head;
。 head可能包含NULL。因此,在if(head != NULL)
if(head->next != NULL) temp->next = head;
修改强>
如果您在提问时发布了完整的代码,那么很容易以正确的方式帮助您。现在人们认为我们回答错了,他们正在投票。好吧无论如何这里是我的答案。
你不应该在自己的插入函数中调用free(temp);
。因为您要在print
函数中访问该内存。您正在insert()
自己释放已分配的内存并尝试访问打印功能。这导致了分段错误。从插入功能中删除free(temp);
。
答案 1 :(得分:0)
是的,它会给出分段错误。在if
条件下,您正在访问head->next
。 head
只是struct node
类型的指针。首先分配内存空间,然后访问该字段。现在你正在访问(head->next)
,这是内存中一些不合适的地址,而内核会给进程带来“分段错误”。例如,执行struct node* head = malloc(sizeof(struct node));
,然后可以访问head->next
。
答案 2 :(得分:0)
请注意,您声明了两个具有相同名称(头部)但在不同范围内的变量:
struct node* head;
void insert(struct node* head,int x);
int main()
{
struct node* head = (struct node*) malloc(sizeof(struct node));
在insert函数中,在检查'head'是否为NULL之前取消引用'head'。始终检查null并且从不假设任何东西。 在功能结束时释放新创建的节点,这也是错误的。最后,insert函数的参数不正确,你需要传递指针的地址才能更改头指向的位置。
该功能看起来应该是这样的
void insert(struct node** head,int x)
{
struct node* temp = malloc(sizeof(struct node));
temp->data = x;
temp->next = NULL;
assert( head != NULL ); // should always be an address
if ( *head == NULL )
{
*head = temp; // done, first in list
}
else // insert as first in list
{
tmp->next = *head;
*head = tmp;
}
}
然后您应该将其称为:
insert(&head,x);