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)
都是检查空指针值的非常好的方法。代码中的空指针检查使用以下两种形式:;看起来这些都不是天生的问题。非常感谢你,你是对的!我还不知道自动变量。