【问题标题】:Table of struct allocate C结构分配表 C
【发布时间】:2013-06-22 19:57:50
【问题描述】:

这是我的结构:

typedef struct wyraz{

    char *slowo;
    char *tlumaczenie;
    struct wyraz *nastepny;

}WYRAZ;

typedef struct lista_tlumaczen{
    char znak;
    WYRAZ *lista_znakowa;
}LISTA_TLUMACZEN;

我想要这样的东西

LISTA_TLUMACZEN tab[5];

但是动态分配我不知道怎么做,有人可以帮我吗?

【问题讨论】:

  • 你用malloc标记了这个。那么?
  • LISTA_TLUMACZEN **tab = malloc(sizeof(LISTA_TLUMACZEN *) * 5)

标签: c arrays struct malloc


【解决方案1】:

当您嵌入了指向结构的指针时,您需要考虑分层内存分配。在这种情况下,首先从最高级别开始效果最好。所以开始吧:

LISTA_TLUMACZEN tab[5];

在这里你说你想要一个 pLISTA_TLUMACZEN 结构表。如果您希望它是动态的,那么您需要一个指向 LISTA_TLUMACZEN 的指针:

LISTA_TLUMACZEN *tab;

然后分配它,你需要确定它有多大。在这种情况下,我们会说NUMBER_OF_ELEMENTS

tab = (LISTA_TLUMACZEN *)malloc(sizeof(LISTA_TLUMACZEN) * 5);

如果您想特别安全地确保malloc 参数不超出范围,您可以使用:

tab = (LISTA_TLUMACZEN *)(NUMBER_OF_ELEMENTS <= (SIZE_MAX / sizeof(LISTA_TLUMACZEN)) ? malloc(sizeof(LISTA_TLUMACZEN) * 5) : NULL);

现在我们有了您的tab[5] 数据声明的动态分配等效项。请注意,它是LISTA_TLUMACZEN 结构的表。所以要分配的内存量是 5 和结构体大小的乘积。

您的LISTA_TLUMACZEN 结构也有一个指向另一个具有更多指针的结构的指针。您可以按照相同的逻辑分配它们,或者实际上仅在程序需要它们时才根据需要分配它们,并在不再需要它们时释放它们(这就是动态分配的原因)。如果您所做的只是使用malloc 预先分配所有内容,那么没有意义,您不妨静态声明所有内容。

【讨论】:

  • int inicializuj_liste_tlumaczen(LISTA_TLUMACZEN glowa) { int i; *glowa = (LISTA_TLUMACZEN)malloc(sizeof(LISTA_TLUMACZEN) * ILOSC_LITER); for ( i = 0; i glowa[i] = (LISTA_TLUMACZEN)malloc( sizeof(LISTA_TLUMACZEN) ); } LISTA_TLUMACZEN **lista = NULL; incializuj_liste_tlumaczen(&lista);这是分配内存的函数,但是不起作用,为什么?
  • @Mr.Nimelo,您更改了问题陈述中的原始代码,使我的回答不再与您的问题陈述相对应。我已经更正了我上面的回答。您展示的这个分配函数有一些问题。首先,您声明的函数接受LISTA_TLUMACZEN 结构作为参数。但是您传递给它的是LISTA_TLUMACZEN ***(指向指向LISTA_TLUMACZEN 的指针的指针)。您需要仔细考虑您的代码,以了解什么是数据以及什么是数据的指针或地址,然后使代码进行相应的匹配。
  • 不要忘记,在进行乘法运算以计算 malloc 大小之前,您可能需要执行完整性检查:tab = (5 &lt;= SIZE_MAX / sizeof(LISTA_TLUMACZEN) ? malloc(sizeof(LISTA_TLUMACZEN) * 5) : NULL);
  • @sh1,谢谢这是一个很好的建议 (+1)。我认为我在安全领域的例子,但你已经很好地涵盖了一般情况。我会把它添加到答案中。
猜你喜欢
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 2018-12-30
  • 2021-05-12
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多