两个malloc定义结构之间的区别

时间:2013-03-12 10:05:48

标签: c compiler-construction casting malloc

我想知道这之间是否存在真正的区别:

c = (struct_t *) malloc(sizeof(struct_t));

和这个

c = malloc(sizeof(struct_t *));

除了避免演员之外,编译器在第二种形式方面是否优先于第一种?或者这两种方式完全相同,只是一个“美学”问题?

5 个答案:

答案 0 :(得分:6)

第一个分配sizeof(struct_t)个字节,第二个sizeof(struct_t*)个字节。

除此之外,malloc的作用是否有所不同,无论你是否投射结果。转换结果使得代码可以接受C ++编译器,但它可以隐藏不包括stdlib.h的错误,因此广泛倾向于不将结果转换为C语言。

答案 1 :(得分:5)

两者完全不同。第一个分配结构的实例,而第二个分配指针到结构。< / p>

通常,它们甚至不会分配相同数量的字节。

答案 2 :(得分:3)

不,他们不一样。后者为指向struct的指针分配4或8个字节的空间,第一个为自己的struct分配足够的空间。

当sizeof(struct_t)足够小,并且当malloc实际分配的次数超过请求时,用户可能看不到差异。

答案 3 :(得分:1)

两种形式不同。它们都分配内存,但数量不同。 一般规则如下: 在分配类型T时,malloc的结果应该转换为T *。

void sample1()
{
    struct pollfd *pfd = (struct pollfd*)malloc(sizeof(struct pollfd));
    // pfd is points to a memory with a size of struct pollfd
    ...
    free(pfd);
}

void sample2()
{
    struct pollfd *pfd = (struct pollfd*)malloc(sizeof(*pfd));
    // same as above, but uses variable type instead
    free(pfd);
}

如果在malloc参数中指定了不正确的类型,通常会导致缓冲区溢出问题:

void sample3()
{
    struct x *px= (struct x*)malloc(sizeof(struct x*));
    x->field = 5; //<< error, as allocated only 4 or 8 bytes depending on pointer size
}

答案 4 :(得分:0)

两者都不同。

通常malloc返回(void *)。所以你想要将void *转换为(struct_t *)。