1
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; 
     } 
} 

请不就是“价值”存储在链表节点本身就是一个指向structure.I我得到一个分段错误在

temp->sp_entry = entry; 

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

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

在做任务之前?还有更好的方法来实现这一目标吗?

其他信息。

当我运行GDB我得到

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

的sp_entry看起来是空pointer.This在加的malloc后打印()function.And也是我的代码已经与“-g相结合 - O0-Wall“。一直没有警告

+1

你是否将'head'初始化为NULL?如果没有,你的'struct'定义之后的'head'声明会使'head'未初始化,并且'head == NULL'测试将失败 – pb2q

+0

是的。我将头初始化为NULL。 – liv2hak

+0

尝试在malloc之前删除cast到'struct node *' –

回答

2

你的代码看起来没问题。由于您在上一行中分配了temp,因此不应出现段错误。

指针错误可能是阴险的。崩溃的线不一定是错误的线。 add()看起来是正确的,所以我怀疑在你的程序执行的早些时候有一个错误不会导致你的程序立即崩溃。

当我运行GDB我得到:

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

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

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

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

+0

当我运行gdb我getp \t * temp $ 3 = {sp_entry = 0x0,next = 0x3e64656269} – liv2hak

2

没有足够的因果报应(?)要发表评论,所以张贴此作为一个答案......

如果你是一个unixy系统,运行Valgrind的(http://valgrind.org/)看有问题的内存读取/写入

1

代码看起来不错。它可以给出分段错误的唯一方法是malloc返回null或无效值。我建议在尝试使用它之前检查malloc返回的空值 。

相关问题