Почему я, оставляя '-> head', должен указывать на struct / union, когда он указывает на другую структуру? - PullRequest
0 голосов
/ 10 ноября 2018

Попытка выяснить, почему я получаю эту ошибку, когда голова указывает на конструкцию. Похоже, голова указывает на длину QNODE. Почему не так?

typedef struct Qnode QNODE;
struct Qnode
{
   int length;
   QNODE* next;
};
typedef struct lqueue lQUEUE;
struct lqueue
{
    QNODE *head;
    QNODE *tail;
};

 lQUEUE lqueue_init_default(void)
{
   lQUEUE* pQ = NULL;
   pQ = (lQUEUE*)malloc(sizeof(lQUEUE));
   pQ->head->length = NULL;
   pQ->tail->length = NULL;
   pQ->head->next = pQ->tail;
   return *pQ;
}

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Для этого стиля очередь , lQUEUE lqueue_init_default(void) возвращает структуру .

К сожалению, код OP выделяет память для структуры и затем возвращает копию памяти. Это теряет оригинальный указатель на выделенное.

Далее, pQ->head->length отменяет ссылки pQ->head, хотя элемент head не был назначен. Конечно, это причина того, что "left of '-> head' должно указывать на struct / union", так как во время выполнения OP определила недопустимое значение pQ->head.


Как исправить это зависит от неустановленных целей кодирования.

Вероятно, для соответствия lQUEUE lqueue_init_default() явному намерению назначьте членов структуры lQUEUE и верните ее копию.

 lQUEUE lqueue_init_default(void) {
   lQUEUE lQ;
   lQ.head = malloc(sizeof *(lQ.head)); // allocate memory for a QNODE, not lQUEUE
   // If allocation successful ...
   if (lQ.head) {
     lQ.head->length = 0;
     lQ.head->next = NULL;
   }
   lQ.tail = lQ.head;  // start with head & tail pointing to the same `QNODE`.
   return lQ;
}

Другая форма lqueue_init_default() может просто назначить head, tail на NULL. Это зависит от других целей кодирования, не указанных.

 lQUEUE lqueue_init_default(void) {
   lQUEUE lQ;
   lQ.head = NULL;
   lQ.tail = lQ.head;  // start with head & tail pointing to the same `QNODE`.
   return lQ;
}

Пример использования

lQUEUE myQ = lqueue_init_default(void);

Я нахожу это все еще из очереди расточительно и не очень полезно. очереди не требуется указатель на голову и хвост, чтобы добавить к обоим концам за O (1) время.

0 голосов
/ 10 ноября 2018

длина int. Pls не использует значение указателя (NULL) и не может ожидать указатель на длину. Какая там ошибка не в посте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...