我在C中有一个List,其中包含以下数据结构:
typedef struct node{
int in_id;
struct node *next;
} Node;
typedef struct List{
Node* head;
Node* tail;
}List;
如果列表被占用,我查看列表前面的功能可以正常工作,但是,如果列表为空并且我在列表中查看,则会收到分段错误。这是完全可以理解的。但是,我一直试图想办法防止这种情况或绕过分割错误。
Node* front(List *q){
Node *temp;
temp = NULL;
if(q->head == NULL && q->tail == NULL){
printf("front function: this is empty \n");
return temp;
}
else{
temp = q->head;
return temp;
}
}
第一个想法是,如果我需要在if(front(Node)->value == x)
中使用front,如果它为空则会出现分段错误。但是,我通过在前面if( something == TRUE && front(Node)->value == x)
之前添加我需要测试的其他内容来使其短路。
我还想到做的是malloc()
前面temp
的一些动态内存,并指定我正在测试的相关字段,如果head && tail == NULL
,我知道这个值是假的。但是,我觉得这是内存泄漏,因为我无法free() temp
。
我是否有更好的方法来处理窥视此队列而不会出现分段错误,如果它是空的?
答案 0 :(得分:1)
我认为你在单行函数调用中试图做太多。 front(Node)->value
始终会尝试取消引用从该函数返回的任何内容,即使它是NULL
,因此当列表为空并返回NULL
时会出现seg错误。您需要拆分该行。首先从调用front(...)
检索指针,然后检查NULL
,如果不是NULL
,则继续解除引用:
Node* temp = front(list);
if (temp != NULL)
{
// proceed with dereference
if (temp->value == x) // this won't seg fault, do whatever with it
{
// ...
}
}
else
{
// print error or do nothing
}
可能有一种更聪明的方法可以单线化,但是如果你陷入困境并且没有严格的线路要求,那真的值得吗?
答案 1 :(得分:0)
如果链表为空,则头节点始终为空。并在您的函数中检查空节点的head head和tail元素。这就是你的分段错误的原因。
试试下面的功能
Node* front(List *q){
Node *temp;
temp = NULL;
if(q == NULL){
printf("front function: this is empty \n");
return temp;
}
else{
temp = q->head;
return temp;
}
}