Недавно я начал немного больше узнавать о структурах данных, а затем, при реализации концепции очереди в C, я столкнулся со следующим:
typedef struct {
int max; /* Max. enqueed items. */
int total; /* Total enqueued. */
int pos_start; /* Pos. of first item. */
int pos_end; /* Pos. of last item. */
int item_size; /* Byte size of each item. */
void** items; /* Array of items. */
} queue_t;
/*
* Omitted code for brevity purposes.
*/
void
queue_add(queue_t* queue, void* item)
{
if (queue_full(queue))
{
fprintf(stderr, "Tried to add an item into a full queue");
exit(1);
}
queue->items[queue->pos_end] = item;
queue->total++;
queue->pos_end = find_next_end(queue);
}
Видимо, это работает. Пара замечаний:
- В оригинальном руководстве рассказывалось, как создать очередь из целых чисел. Я пытался бросить вызов самому себе, создав очередь «любого» элемента - вот почему я пытаюсь использовать массив из
void*
элементов. - Из-за того, что я использую массив
void*
элементы, я знаю, что всякий раз, когда я хочу использовать какой-либо элемент из этой очереди (например, в основной функции с помощью queue_pop
), мне нужно выполнить правильное приведение. Используя приведение, компилятор может точно знать, сколько байтов эта переменная должна занять в памяти.
Однако, мой большой вопрос :
На основании моего функция, когда я помещаю sh новый элемент в очередь, я сохраняю его в queue->items[queue->pos_end]
. Если компилятор не знает, сколько байтов item
имеет (как он помечен как void*
), как он вычисляет адрес памяти для queue->items[queue->pos_end]
?