gpt4 book ai didi

c - 将节点添加到链表时出现段错误

转载 作者:太空宇宙 更新时间:2023-11-04 01:10:52 24 4
gpt4 key购买 nike

typedef struct 
{
uint32_t field_id;
uint16_t length;
}entry_t;


struct node
{
entry_t *sp_entry;
struct node *next;
}*head;

我有一个名为 add() 的函数,用于向链表添加条目。

void add( entry_t *entry )
{
struct node *temp;
temp=(struct node *)malloc(sizeof(struct node));
temp->sp_entry = entry;
if (head== NULL)
{
head=temp;
head->next=NULL;
}
else
{
temp->next=head;
head=temp;
}
}

请注意,存储在链表节点中的“值”本身就是一个指向结构的指针。我在以下位置遇到段错误

temp->sp_entry = entry;

这可能是因为我没有为 entry_t 结构分配内存。我想知道这是一个常见的用例吗?如果是,我该怎么做。我必须做吗?

temp->sp_entry = malloc(sizeof (entry_t));

在做作业之前?还有更优雅的方法来实现这一目标吗?

附加信息。

当我运行 gdb 时,我得到了

p *temp
$3 = {sp_entry = 0x0, next = 0x3e64656269}

sp_entry 看起来像是一个空指针。这是在 add() 函数中的 malloc 之后打印的。而且我的代码已与“-g -O0 -Wall”结合使用。没有警告

最佳答案

您的代码看起来没问题。 temp->sp_entry = entry; 不应出现段错误,因为您在上一行分配了 temp

指针错误可能是隐蔽的。崩溃的线路不一定是故障线路。 add() 看起来是正确的,所以我怀疑在您的程序执行的早期存在一个不会导致您的程序立即崩溃的错误。

When I run gdb I get:

p *temp
$3 = {sp_entry = 0x0, next = 0x3e64656269}

The sp_entry looks like it is a null pointer.

没问题。您尚未初始化 temp->sp_entrytemp->next 因此它们的值没有意义。

重要的是 temp 的值。它似乎是一个有效的指针,因为 gdb 可以打印 *temp。这真的是发生段错误的地方吗?我本以为 gdb 会提示 temp 是指向无效内存位置的指针,并拒绝打印 *temp

关于c - 将节点添加到链表时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12683488/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com