Ваш код очень склонен к неопределенному поведению ... Посмотрите на это 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)
должно быть так:
lQueue * lqueue_init_default(void) // Since you are returning a pointer...
Вы увидите, что код работает нормально, потому что нет неопределенного поведения ...
Обратите внимание, что вы можете никогда не обращаться к объекту, который присвоен NULL ... ( Только если вы не хотите, чтобы ваша программа работала неопределенно ...) Итак, это:
pQ->tail = NULL;
это небезопасно , по крайней мере ... Структурные указатели, назначаемые на NULL
, обычно видны только тогда, когда они уничтожены ... Пример приведен ниже ...
Кроме того, не имеет отношения к , но имеет деструктор для структуры и вызывает ее, когда вам больше не нужна структура, или она утечет память потом ...
void destroy_lqueue(struct lqueue ** queue)
{
if (queue != NULL)
queue = NULL;
free(queue);
}