Как выделить память для структуры внутри структуры? (на C)

#c

#c

Вопрос:

Итак, у меня есть эти структуры

 // structures.
typedef struct{
    char *name;
    int price;
    double weight;
}item;

typedef struct{
    item **items;
    int num_items;
}inventory;

typedef struct{
    char *name;
    int level;
    long xp;
    inventory Inventory;
}character;
 

Я уже смог создать символ с помощью функции, а затем вызвать другую функцию для просмотра этого символа, но я не могу понять, как выделить место для и элемента или инвентаря.

 inventory *add_item(inventory *invp){
        if(invp == NULL){
            inventory *invp = calloc(1, sizeof(inventory)); // Allocating memory for inventory
            items = calloc(1, sizeof(items *)); // need to allocate space for the item **items
            char buffer[buf] = { 0 };
            printf("Enter name: ");                
            fgets(buffer, buf, stdin);
            remove_newline(buffer);
            items->new_item->name = (strlen(buffer)   1, sizeof(char));
            strcpy(items->new_item->name, buffer);
    
            printf("Enter price: ");
            scanf("%d", amp;items->new_item->price);
            while(getchar() != 'n');
    
            printf("Enter weight: ");
            scanf("%ld", amp;items->new_item->weight);
            while(getchar() != 'n');
    
            return items; // <---- this is the new character just created.    }
    
        }
}
 

это моя функция создания символа

 character *create_character(character *c){  // input to this function->address to a structure.
      
    if(c == NULL){
        char buffer[buf] = { 0 };                                  // (so a pointer.)
        character *c = calloc(1, sizeof(character));

        printf("Enter charcter name: ");
        fgets(buffer, buf, stdin);
        remove_newline(buffer); // removing the new line.

        c->name = calloc(strlen(buffer)   1, sizeof(char)); //allocating memory for character
        strcpy(c->name, buffer);  // copying input into memory just allocated.

        printf("Enter level: ");
        scanf("%d", amp;c->level);
        while(getchar() != 'n');

        printf("Enter XP: ");
        scanf("%ld", amp;c->xp);
        while(getchar() != 'n');

        c->Inventory = calloc(1, sizeof(inventory));

        return c; // <---- this is the new character just created.    }

    }else {
        printf("ERROR: Character Already Exist.n");
    }
        
}
 

Я пытался использовать тот же формат, который я использовал для создания символа для создания элемента, но часть указателя меня смущает, я инициализирую инвентарь внутри c, а затем вызываю ** элементы, чтобы иметь возможность создавать элемент?

Комментарии:

1. Поскольку Inventory это экземпляр inventory структуры, его память выделяется вместе с окружающей character структурой.

2. Что касается inventory структуры, как вы думаете, зачем вам нужен указатель на указатель items ? Каковы ваши мысли, анализ и дизайн, которые заставили вас подумать, что это было бы хорошим решением? Кроме того, учитывая, что список символов может быть динамическим, почему бы не сделать его связанным списком, в котором вы можете легко добавлять и удалять узлы?

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

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