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”组合在一起。没有警告
答案 0 :(得分:2)
您的代码看起来不错。由于您在上一行分配了temp->sp_entry = entry;
,因此temp
不应该是段错误。
指针错误可能是阴险的。崩溃的线路不一定是故障线路。 add()
看起来是正确的,所以我怀疑程序执行早期出现错误,不会导致程序立即崩溃。
当我运行gdb时,我得到:
p *temp $3 = {sp_entry = 0x0, next = 0x3e64656269}
sp_entry看起来像是一个空指针。
不是问题。您尚未初始化temp->sp_entry
或temp->next
,因此他们的值毫无意义。
重要的是temp
的价值。它似乎是一个有效的指针,因为gdb可以打印*temp
。这真的是发生段错误的地方吗?我希望gdb抱怨temp
是指向无效内存位置的指针,并拒绝打印*temp
。
答案 1 :(得分:2)
没有足够的业力(?)发表评论,因此将此作为答案张贴......
如果您使用的是unixy系统,请运行Valgrind(http://valgrind.org/)以查看有问题的内存读/写
答案 2 :(得分:1)
代码似乎很好。它可以给出分段错误的唯一方法是malloc返回null或无效值。我建议检查malloc返回的值为null 在尝试使用之前。