C 在deque实现中检查无效指针
我在检查无效指针时遇到困难。 我有一个C 在deque实现中检查无效指针,c,pointers,struct,C,Pointers,Struct,我在检查无效指针时遇到困难。 我有一个struct,我想用它作为出列。看起来是这样的: struct _dequeue_ { struct _dequeue_* next; struct _dequeue_* prev; int data; }; typedef struct _dequeue_ dequeue; 在我的函数中,我想把一个元素推到出列的末尾,我首先检查是否已经有一个元素,如果没有,我想迭代列表,直到找到下一个指针中有空指针的元素。但是,当我的循环到达空指针时,Vis
struct
,我想用它作为出列。看起来是这样的:
struct _dequeue_ {
struct _dequeue_* next;
struct _dequeue_* prev;
int data;
};
typedef struct _dequeue_ dequeue;
在我的函数中,我想把一个元素推到出列的末尾,我首先检查是否已经有一个元素,如果没有,我想迭代列表,直到找到下一个指针中有空指针的元素。但是,当我的循环到达空指针时,VisualStudio在运行时停止并说hp是0xCCCC
,不允许在那里读取
代码如下:
void dequeue_push_back(dequeue** dq, int data)
{
//hp is a pointer to a struct
//dq** points to the beginning of the list
if (hp == NULL)
{
dequeue OnlyElement;
OnlyElement.data = data;
OnlyElement.next = NULL;
OnlyElement.prev = NULL;
hp = &OnlyElement;
dq = &hp;
}
else
{
while (hp)
{
hp = hp->next; //error occurs in this line
}
}
}
所以我的问题是为什么会发生这种情况,以及如何成功地检查无效指针。提前谢谢 您引用了一个自动变量(仅限
OnlyElement
)
因此,一旦if(hp==NULL){}
块完成,hp
指针就不再有效,因为dequeue
实例被销毁
在堆上分配出列
,如下所示:
dequeue * OnlyElement = malloc(sizeof(dequeue));
OnlyElement->data = data;
OnlyElement->next = NULL;
OnlyElement->prev = NULL;
hp = OnlyElement;
dq
分配似乎也错了
你可能想要这个:
*dq = hp;
但是您的代码不完整,因此这只是一个猜测。您是否可以包含
hp
的详细信息,因为这是触发错误的代码?这是一个全球性的问题吗?一个本地的出列\u推回
?还请添加调用出列\u推回的代码。谢谢几乎可以肯定的是,惠普没有初始化任何东西。由于您甚至没有显示其声明,很难说在布尔上下文中评估(hp)
或(hp==NULL)
或(hp!=NULL)
都是检查空指针值的非常好的方法。代码中的空指针检查使用以下两种形式:;看起来这些都不是天生的问题。非常感谢你,你是对的!我还不知道自动变量。