【问题标题】:How do you use malloc to allocate space for an array of structures?如何使用 malloc 为结构数组分配空间?
【发布时间】:2015-04-20 05:12:51
【问题描述】:

我目前正在动态分配我的结构数组,但我不确定如何继续。这是我的结构:

struct Word_setup 
{
    char word[M];
    int count;
} phrase[N];

我知道malloc 返回一个指向内存块的指针,但我不确定它在涉及结构数组时是如何工作的。
如果有人可以请澄清,将不胜感激!

【问题讨论】:

  • 对于一个更简单的数组,比如一个整数数组,你会怎么做?没有什么不同。
  • 或许size_t N = 5; struct Word_setup *phrase = malloc(N * sizeof *phrase);
  • @chux 这就是我要做的,随着程序的进行,我需要重新分配内存。我意识到这可能应该是我的问题....

标签: c arrays struct malloc realloc


【解决方案1】:

你的意思可能是:

struct Word_setup {
    char word[M];
    int count;
};

最好避免在结构定义的同一行中定义变量,以提高代码的可读性。

然后你可以分配一个数组:

int main()
{
    struct Word_setup *phrase = malloc(N * sizeof *phrase);

    // use phrases[x] where 0 <= x < N

    phrase = realloc(phrase, (N+5) * sizeof *phrase);

    // now can go up to phrases[N+4]

    free(phrase);
}

当然,如果mallocrealloc 返回NULL,您应该检查失败并中止程序。


如果您还想动态分配单词内的每个字符串,那么有几个选项;最简单的理解是将char word[M] 更改为char *word;,每次分配一个短语时,写the_phrase.word = malloc(some_number);。如果你分配一个单词数组,你需要循环遍历每个单词。

【讨论】:

  • 你所说的“x
  • @NicolasDiken 是的,与 malloc 表达式中出现的 N 相同
  • 好吧,这就是我的假设。现在的问题是使用realloc 动态重新分配空间。我不是 100% 确定语法,所以我不断收到愚蠢的错误。这是我尝试过的:phrase = realloc(phrase, SIZE * i);,但我收到一个错误,说我正在将void pointer 转换为输入struct Word_setup。这很清楚,但我不确定如何改变这一点。
  • @NicolasDiken 这没有多大意义,将您的realloc 行与您的malloc 行进行比较,看看您做了哪些不同的事情。我会用一个例子来更新我的代码。
  • 奇怪的是,我之前没有看到这个错误。我的代码 O.ostruct Word_setup *phrase = malloc(N * sizeof *phrases); 行出现同样的错误
【解决方案2】:

我认为NM 是编译时已知的常量。然后只需使用sizeof,.e.g.

 struct Word_setup*ptr = malloc(sizeof(struct Word_setup)*N);

也许你想要flexible array member。然后,它应该始终是您的struct最后一个 成员,例如

  struct Word_setup {
     int count;
     unsigned size;
     char word[]; // of size+1 dimension
  };

当然,拥有一个大小灵活的结构数组是没有意义的——你需要一个指向它们的指针数组。

【讨论】:

  • 在这种情况下,我想要的是一个灵活的结构数组。因此,数组可以随着向自身读取更多项目而增长。
  • 为什么不使用指向灵活struct-s 的灵活指针数组呢?看起来你应该这样做!
  • 整个程序的目标是读取一个文件,输出出现次数最多的单词,以及出现次数。我通过创建一个结构数组来做到这一点,每个结构都存储单词以及计数。现在我的问题是我需要让这个数组随着更多的单词被扫描而动态变化。
猜你喜欢
  • 1970-01-01
  • 2013-07-09
  • 1970-01-01
  • 2018-09-21
  • 2017-05-29
  • 2015-06-27
  • 2021-05-13
  • 2021-05-29
  • 1970-01-01
相关资源
最近更新 更多