您如何使用malloc为一个结构体分配内存?

5
我的程序的目标是读取一个文件,并输出出现次数最多的单词以及它的出现次数。但我在使用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

如果您需要更多相关信息,请告诉我。


1
#define SIZE (sizeof(*phrase)) - BLUEPIXY
3
即使你改变了 type 类型,使用 type *ptr = malloc( sizeof(*ptr) ); 仍然是非常值得的,因为这样可以避免掉入这种错误。 - edmz
@JoachimPileborg 这很奇怪,因为我已经尝试了两种方式,当我在Sublime中尝试构建文件时,如果我不将结果转换为所需类型,它会给我一个错误。 - krazibiosvn
1
C++需要强制类型转换。在C中是可选的(不需要)。您是否使用C++编译? - chux - Reinstate Monica
@chux 昨晚我问了一些人,发现我在使用C++编译器,但现在即使我强制编译成C,仍然出现相同的错误。 - krazibiosvn
显示剩余6条评论
1个回答

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

应该是

phrase =  malloc(sizeof(struct Word_setup));

你手头的东西是什么。
#define SIZE (sizeof(phrase)) 

这将给出指针的大小,而不是结构体的大小。您还可以使用更通用的方法来分配内存。

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

2
小的风格问题:不需要 ()。可以使用 malloc(sizeof *p) - chux - Reinstate Monica
如果我这样做,在Sublime中构建程序时,它会告诉我将void指针转换为结构体时出现错误。 - krazibiosvn
你也可以使用更通用的内存分配方法,void* 实际上什么也做不了,你必须将它转换为某些具有实际意义的类型,因此要回到这个问题 - edmz
@chux 但我们必须使用sizeof()两种方式,所以我认为从OP的角度来看应该没问题。 - Gopi
1
使用 () 当然可以 - 只是指出一种可能的简化。 - chux - Reinstate Monica
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接