我在检查无效指针时遇到困难。
我有一个struct
,我想将其用作出队。它看起来像这样:
struct _dequeue_ {
struct _dequeue_* next;
struct _dequeue_* prev;
int data;
};
typedef struct _dequeue_ dequeue;
在我的函数中,我想将一个元素推到出队的末尾,我首先检查是否已经存在一个元素,如果没有,我想迭代列表,直到找到具有空指针的元素它是下一个指针。但是,当我的循环到达空指针时,Visual Studio 在运行时停止并显示 hp was 0xCCCCCCCC
并且不允许在那里读取。
代码如下:
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) { }
block 完成,hp
指针就不再有效,因为 出队
实例被销毁。
在堆上分配出队
,例如:
dequeue * OnlyElement = malloc(sizeof(dequeue));
OnlyElement->data = data;
OnlyElement->next = NULL;
OnlyElement->prev = NULL;
hp = OnlyElement;
dq
赋值似乎也是错误的。
您可能想要这个:
*dq = hp;
但是您的代码不完整,所以这只是一个猜测。
关于检查双端队列实现中的无效指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39983484/