Представьте себе две структуры, определенные как:

struct list
{
  struct block *first;
  struct block *last;
};

struct block
{
  uint8_t *address;
  uint32_t alloc_count;
  struct block *prev;
  struct block *next;
};

Если я сделаю list->first->address, это сработает? Так как list->first указывает на блочную структуру, которая имеет адресное значение. Как насчет list->first->next (поскольку это также указывает на блочную структуру?). А что, если я сделаю block->first, я предполагаю, что это не сработает, так как first определен в структуре списка?

Если я определяю новую структуру и объявляю ее так: struct block *temporary = list->first, будет ли временный список блоков или только первый блок списка?

Эти вопросы могут показаться глупыми, но я читал о структурах последние два часа и, кажется, не могу обойти это. Если кто-то может пояснить, буду признателен.

c
-1
LLScheme 14 Дек 2019 в 15:12
1
Что произошло, когда вы попытались? Как вы пытались? Пожалуйста, покажите код, который вы пробовали, и сообщите об ошибках, которые вы получили, или о поведении, которое вы наблюдали.
 – 
Yunnosch
14 Дек 2019 в 15:15
У меня нет возможности проверить это, так как я изо всех сил пытался присвоить значения элементам структур:/
 – 
LLScheme
14 Дек 2019 в 15:23
Вы хотите знать, как распределить данные по этому двусвязному списку? И что означает это свойство uint8_t *address; uint32_t alloc_count;?
 – 
Maqcel
14 Дек 2019 в 15:59
Вы боролись. Покажи как. Объясните, как это не удалось. Это будет полезно, если вы продемонстрируете свой уровень знаний и понимания и проиллюстрируете свой образ мышления.
 – 
Yunnosch
14 Дек 2019 в 16:33
Нарисуйте картинку/диаграмму для визуализации со стрелками, представляющими (ненулевые) указатели. Это очень помогает при такого рода проблемах.
 – 
Ulrich Eckhardt
14 Дек 2019 в 17:28

1 ответ

Вы ничего не можете сделать из того, что написали, потому что это просто объявление структур, а не реальных объектов, с которыми вы имеете дело. Но если вы создадите их, вы сможете выполнять все действия, которые захотите.

struct list new_list;
struct block new_block;

uint8_t address = new_list->first->address; // OK
struct block target_block = new_list->first->next; // OK

Конечно, вы не можете использовать new_block->first, потому что в вашей структуре блока нет поля first.

struct block *temporary = list->first будет не списком блоков и не первым блоком списка, это будет указатель на первый блок списка. Но вы можете легко получить доступ ко всему списку через first->next, first->next->next и т. д. Просто поместите i = i->next в свой цикл for.

0
14 Дек 2019 в 17:16
Обратите внимание, что, поскольку код написан на C, во фрагментах вопроса нет типа list. Есть только тип struct list. С++ делает по-другому
 – 
Jonathan Leffler
14 Дек 2019 в 17:11
О, действительно, спасибо, совсем забыл об этом. Однако не занимайтесь C в течение двух лет. Отредактировал.
 – 
user12531529
14 Дек 2019 в 17:15