, поскольку папка (родитель) может содержать несколько дочерних элементов, мне нужно динамически выделить память для хранения указателя на нового дочернего элемента в родительском элементе.
Ну, нет, вы для этого не обязательно нужно Dynami c. Вместо этого вы можете выбрать фиксированную верхнюю границу для количества дочерних элементов в каждой папке и поместить массив этого измерения в struct MenuItems
. Поскольку вы говорите о хранении только указателей для детей, это выглядело бы примерно так:
typedef struct MenuItems
{
struct MenuItems *parent;
struct MenuItems *child[MAX_CHILDREN];
uint8_t numChildren;
// ...
Но динамический подход к распределению c дает вам большую гибкость и возможно также более эффективное использование памяти за счет сложности кода. Большинство людей взяли бы этот обмен. Но теперь сравните вышесказанное с соответствующей частью вашего фактического объявления:
typedef struct MenuItems
{
struct MenuItems *parent; // pointer to parent level item (-1 level)
struct MenuItems *child; // pointer to child level items (+1 level) (FOLDER ONLY)
uint8_t numChildren; // number of child items held by this item (FOLDER ONLY)
Тщательно сравните типы двух разных объявлений MenuItem.child
. Они никоим образом не взаимозаменяемы.
Я получаю сообщение об ошибке "несовместимые типы при назначении типа" struct MenuItems "из типа" MenuItem * {aka struct MenuItems *} '"
Я уверен, что вы. Это может произойти из этого оператора:
parentItem->child[newIndex] = newItem;
, учитывая, что тип newItem
равен struct MenuItems *
.
Этот оператор будет правильным для массива Альтернативу я представил, потому что там тип parentItem->child[newIndex]
также struct MenuItems *
. Но вот почему я попросил вас сравнить. В вашем случае тип parentItem->child[newIndex]
равен struct MenuItems
(то есть не указатель). Это было бы целесообразно для хранения самих дочерних элементов меню, а не указателей на них. И это тоже был бы жизнеспособный подход.
Предполагая, однако, что вы хотите придерживаться заявленной стратегии, и чтобы каждый элемент папки хранил указателей на своих потомков, вам нужно изменить struct MenuItems
соответственно:
typedef struct MenuItems
{
struct MenuItems *parent;
struct MenuItems **child;
uint8_t numChildren;
// ...
Затем вы также захотите уменьшить размер своих выделений для члена child
, потому что, опять же, вы говорите, что хотите хранить указатели там, не сами дети.