0

我很难找到这个问题的答案;我在网上找到了类似的例子,但没有一个能解决我的问题。

我有一个struct用于公司数据的 Company,还有一个struct用于公司集合的 Consortium。第二个struct将包含第一个的可变长度数组struct,即公司数据struct。可变长度数组的元素数量取决于联盟中公司的数量。

我想动态分配所需的任何东西,但我有点迷失了。这些是结构:

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

typedef struct {
    int numCore;
    int numAssoc;
    Company core[];
    Company assoc[];
} Consortium;

核心公司会有一些,而这个数量就是财团中核心阵列的规模struct。联营公司也是如此。

我想出了这个表达,但我不确定我错过了什么:

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

2 回答 2

3

您需要使用指针并分别分配数组:

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!

Company类型修改为:

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

这节省了分配代码元素的循环。

于 2012-10-21T03:50:08.983 回答
0

您可能会认为您使 Consortium 结构更简单一些。由于您对每种类型、core 和 assoc 都有计数,因此您可以只有一个数组,其中第一部分用于 core,第二部分用于 assoc。

因此,您的结构将类似于以下源代码(尚未编译,只是记下而不是经过测试,因此请注意):

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;

然后,您将通过以下方式创建您的实际数据结构:

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;
}

在此之后,您可以通过一些指示成功与否的函数来填写它:

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;
}

然后您将使用另一组辅助函数访问它们。

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;
}
于 2012-10-21T03:56:47.653 回答