Динамическое выделение памяти из двух структур, структура A имеет указатель на структуру B - PullRequest
0 голосов
/ 16 июня 2019

У меня есть две структуры A и B. В структуре B есть указатель типа struct A. Обе структуры / экземпляры должны выделять память во время выполнения. Линейно зависимы. Я разместил код, который должен представить мою идею, которая не работает. Пожалуйста, покажи мне правильный путь.

#include <stdio.h>
#include <string.h>
#include <stdlib.h> //EXIT_SUCCESS, calloc

struct A
{
 char *name;
 int id;
};

struct B
{
 char *buildingName;
 struct a *ptra;
};


int main()
{

   int employe = 1;
   int NrOfBuildinTemplates = 3;

   struct A *humans;
   struct B *buildings; 

   humans =  calloc(employe, sizeof(struct A));
   buildings = calloc(NrOfBuildinTemplates, sizeof(struct B));

   buildings[0].buildingName = strdup("Building A");
   buildings[1].buildingName = strdup("Building B");
   buildings[2].buildingName = strdup("Building C");


   int count = 100, n = 0;
   for (size_t i = 3; i < count; i++)
   {
      buildings = realloc (buildings, sizeof(struct B) * (i+1));
      buildings[i].buildingName = strdup("Building XYZ");
      buildings[i].ptra = &(humans[n]);
      buildings[i].ptra->name = strdup("NameXYZ"); 
      humans = realloc(humans, sizeof(struct A) * (n+1));
      n++;
   }


   for (size_t i = 3; i < count; i++)
   {
      printf("%s -> %s\n", buildings[i].buildingName, buildings[i].ptra->name);
      n++;
   }
 return 0;
}

1 Ответ

0 голосов
/ 16 июня 2019
  buildings = realloc(buildings, i+1);

Это неправильно. Должно быть:

  buildings = realloc(buildings, sizeof(struct B) * (i+1));

Есть похожая проблема с этим:

  humans = realloc(humans, n+1);

Кроме того, этот код полностью сбивает с толку. Я не могу предложить, как это исправить, потому что я понятия не имею, что вы думаете, это делает:

  buildings[i].ptra = (*buildings->ptra) calloc(1, buildings->ptra);
  buildings[i].ptra = &(humans[n]);
  buildings[i].ptra = strdup("NameXYZ"); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...