将节点添加到链接列表时出现分段错误

时间:2012-10-02 01:46:45

标签: c pointers linked-list segmentation-fault singly-linked-list

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”组合在一起。没有警告

3 个答案:

答案 0 :(得分:2)

您的代码看起来不错。由于您在上一行分配了temp->sp_entry = entry;,因此temp不应该是段错误。

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

  

当我运行gdb时,我得到:

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

sp_entry看起来像是一个空指针。

不是问题。您尚未初始化temp->sp_entrytemp->next,因此他们的值毫无意义。

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

答案 1 :(得分:2)

没有足够的业力(?)发表评论,因此将此作为答案张贴......

如果您使用的是unixy系统,请运行Valgrind(http://valgrind.org/)以查看有问题的内存读/写

答案 2 :(得分:1)

代码似乎很好。它可以给出分段错误的唯一方法是malloc返回null或无效值。我建议检查malloc返回的值为null 在尝试使用之前。