【问题标题】:How do you use malloc to allocate memory for a structure?如何使用 malloc 为结构分配内存?
【发布时间】:2015-06-27 12:42:51
【问题描述】:

我的程序的目标是读取一个文件,并输出出现次数最多的单词,以及出现次数。但是我遇到了malloc 及其语法的问题。 这是malloc所指的结构:

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

我的主要部分帮助我发现这是我的错误:

    printf("Pre-Allocation Test");

    struct Word_setup *phrase;

    phrase = (struct Word_setup *) malloc(SIZE);

    if (phrase == NULL)
        {printf("Failure allocating memory"); return 0;}

它似乎只是打印出来,Pre-Allocation Test,然后冻结。正如我之前所说,我不清楚如何解决此问题,但我已将其隔离。

*如果你想知道SIZE 是什么:

#define SIZE (sizeof(phrase))


编辑:

对于那些对编译器版本/操作系统/等感兴趣的人: Windows 7 64 位,GCC 4.9.2

如果您想了解更多信息,请告诉我。

【问题讨论】:

  • #define SIZE (sizeof(*phrase))
  • 真的很值得用type *ptr = malloc( sizeof(*ptr) );这样即使换了type也不会犯这种错误。
  • @JoachimPileborg 这很奇怪,因为我已经尝试了两种方法,当我尝试在 sublime 中构建文件时,如果我不转换结果,它会给我一个错误
  • C++ 需要强制转换。对于 C,它是可选的(并且不需要)。你是用 C++ 编译的吗?

标签: c malloc realloc


【解决方案1】:
phrase = (struct Word_setup *) malloc(SIZE);

应该是

phrase =  malloc(sizeof(struct Word_setup));

你拥有的是

#define SIZE (sizeof(phrase)) 

会给你指针的大小而不是结构的大小。您还可以使用更通用的内存分配方法

type *p = malloc(sizeof(*p));

【讨论】:

  • 小风格问题:() 不需要。可以使用malloc(sizeof *p)
  • 如果我这样做,当我在 sublime 中构建程序时,它会告诉我将 void 指针转换为结构时出错
  • “你也可以使用更通用的方法来分配内存”你几乎可以用void*做任何事情,你必须把它转换成某种东西来赋予它一个意义,因此回到this.
  • @chux 但我们一定会使用 sizeof() 是两种方式,所以我认为从 OP 的角度来看应该没问题
  • 使用()当然没问题。- 只是指出可能的简化。
猜你喜欢
  • 1970-01-01
  • 2015-11-09
  • 2015-01-05
  • 2021-05-29
  • 2018-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多