Mallocing tableau de structures dans une structure (C)

J’ai du mal à trouver la réponse à ce problème; J’ai trouvé des exemples similaires de cela en ligne, mais aucun ne résout mon problème.

J’ai une struct pour les données d’une société, société, et une seconde struct pour des collections de sociétés, Consortium. La deuxième struct contiendra des tableaux de longueur variable de la première struct , la struct données d’entreprise. Le nombre d’éléments des tableaux de longueur variable dépendra du nombre de sociétés dans un consortium.

Je veux allouer dynamicment ce qui est nécessaire mais je me perds un peu. Ce sont les structs:

 typedef struct { char code[]; double sharePrice; int numShares; double totalVal; double totalDebts; } Company; typedef struct { int numCore; int numAssoc; Company core[]; Company assoc[]; } Consortium; 

Il y aura un certain nombre de sociétés principales, et ce nombre correspondra à la taille du groupe principal de la struct du consortium. Il en va de même pour les entresockets associées.

Je suis venu avec cette expression mais je ne suis pas sûr de ce que je manque:

 Consortium *consort=((Consortium*)malloc((numCore+numAssoc)*(sizeof(Consortium)); 

Vous devrez utiliser des pointeurs et allouer les tableaux séparément:

 typedef struct { char *code; double sharePrice; int numShares; double totalVal; double totalDebts; } Company; typedef struct { int numCore; int numAssoc; Company *core; Company *assoc; } Consortium; Consortium *c = malloc(sizeof(*c)); // Error check c->numCore = 4; c->core = malloc(sizeof(*c->core) * c->numCore); // Error check c->numAssoc = 3; c->assoc = malloc(sizeof(*c->assoc) * c->numAssoc); // Error check for (int i = 0; i < c->numCore; i++) c->core[i].code = malloc(32); // Error check for (int i = 0; i < c->numAssoc; i++) c->assoc[i].code = malloc(32); // Error check // Worry about other data member initializations! 

Il serait plus simple et peut-être préférable de modifier le type de Company pour:

 typedef struct { char code[32]; double sharePrice; int numShares; double totalVal; double totalDebts; } Company; 

Cela évite les boucles allouant les éléments de code.

Vous pourriez penser que vous simplifiez un peu la structure du consortium. Etant donné que vous avez les nombres pour chaque type, core et assoc, vous ne pouvez avoir qu’un seul tableau, dont la première partie est pour core et la seconde partie est pour assoc.

Donc, votre structure ressemblerait à la source suivante (qui n’a pas été compilée et qui est simplement notée plutôt que testée, donc attention):

 typedef struct { int numCore; // number of core companies, first part of m_companies int numAssoc; // number of assoc companies, second part of m_companies Company m_companies[1]; } Consortium; 

Ensuite, vous créeriez votre structure de données réelle en quelque chose comme:

 Consortium *makeConsortium (int numCore, int numAssoc) { Consortium *pConsortium = malloc (sizeof(Consortium) + sizeof(Company) * (numCore, numAssoc)); if (pConsortium) { pConsortium->numCore = numCore; pConsortium->numAssoc = numAssoc; } return pConsortium; } 

Après cela, vous pouvez remplir certaines fonctions indiquant le succès ou non:

 int addCompanyCore (Consortium *pConsortium, int index, Company *pCompany) { int iRetStatus = 0; if (pConsortium && index < pConsortium->numCore) { pConsortium->m_companies[index] = *pCompany; iRetStatus = 1; } return iRetStatus; } int addCompanyAssoc (Consortium *pConsortium, int index, Company *pCompany) { int iRetStatus = 0; if (pConsortium && index < pConsortium->numAssoc) { index += pConsortium->numCore; pConsortium->m_companies[index] = *pCompany; iRetStatus = 1; } return iRetStatus; } 

Et vous y accéderiez avec un autre ensemble de fonctions d’aide.

 Company *getCompanyCore (Consortium *pConsortium, int index) { Company *pCompany = 0; if (pConsortium && index < pConsortium->numCore) { pCompany = pConsortium->m_companies + index; } return pCompany; } Company * getCompanyAssoc (Consortium *pConsortium, int index) { Company *pCompany = 0; if (pConsortium && index < pConsortium->numAssoc) { index += pConsortium->numCore; pCompany = pConsortium->m_companies + index; } return pCompany; }