为什么`pLQ-> tail`为空指针?

时间:2018-11-11 04:30:36

标签: c pointers linked-list queue

我正在排队,并且一直遇到排队问题。我认为这是相关代码:

id

每当我尝试运行程序时,在运行时都会收到此错误:
引发异常:读取访问冲突。 arr = np.array([[1, 2], [3, 4], [5, 6]]) arrflat = arr.flatten() assert arrflat.base is not arr arrravel = arr.ravel() assert arrravel.base is arr 为nullptr。
为什么它是空指针?与初始化功能有关吗?
称呼为:

typedef struct Qnode QNODE;
struct Qnode
{
  int length;
  QNODE* next;
  QNODE* prev;
};

typedef struct lqueue lQUEUE;
struct lqueue
{
   QNODE *head;
   QNODE *tail;
};

lQueue lqueue_init_default(void)
{
lQUEUE* pQ = NULL;
pQ = (lQUEUE*)malloc(sizeof(lQUEUE));
if (pQ != NULL)
{
    pQ->head = NULL;
    pQ->tail = NULL;
}
pQ->head = pQ->tail;
return pQ;
}

Status lqueue_henqueue(lQueue* hLQ, int lc)
{
lQUEUE* pLQ = (lQUEUE*)hLQ;
QNODE* new = (QNODE*)malloc(sizeof(QNODE));
if (new == NULL)
{
    printf("Couldn't allocate space.\n");
    return FAILURE;
}
new->length = lc;
new->next = pLQ->tail->next;

pLQ->tail = new;
return SUCCESS;
}

1 个答案:

答案 0 :(得分:0)

您的代码极易出现undefined behavior ...查看此1 1 0 1 1 0 0 1 0 语句:

if

应该应该 ...

if (pQ != NULL)
{
    pQ->head = NULL; // This pointer is now 'NULL'
    pQ->tail = NULL; // This is also 'NULL'
}

这是

if (pQ != NULL)
{
    pQ->head = (QNODE*)calloc(1, sizeof(lQUEUE)); // This is proper pointer initialization...
    pQ->tail = (QNODE*)calloc(1, sizeof(lQUEUE));
}

应该是这样的:

lQueue lqueue_init_default(void)

您将看到代码工作正常,因为没有未定义的行为 ...

  

请注意,您可以never access an object that is assigned to NULL ...((仅当您不希望您的程序表现为未定义状态 ...]时),因此:

lQueue * lqueue_init_default(void) // Since you are returning a pointer...
     

至少不是不安全 ...分配给 pQ->tail = NULL; 的结构化指针通常仅在被销毁后被看到。 > ... 下面是一个示例...


不相关,但结构具有析构函数,并在不再需要该结构时调用它,否则它将然后泄漏内存 ...

NULL