检查双端队列实现中的无效指针

标签 c pointers struct

我在检查无效指针时遇到困难。 我有一个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/

相关文章:

java - C 和 Java 中表达式++a,a,a-- 的输出

python - 获取 Cython 指针的值

iphone - 从 iphone 中的 .wav 文件读取时数据为空?

C:指向二维指针数组的指针

c - 库存计划,可能的边界值问题?

c - 链表中的节点是单独的结构还是同一结构的一部分?

c++ - 为什么结构内的命名 union 会覆盖其他结构成员?

c - 为什么依赖溢出整数的循环在不同计算机上的工作方式不同?

C++ 我的字符串类 : Pointer doesn't work

c - 将返回的指针分配给数组