我想知道这之间是否存在真正的区别:
c = (struct_t *) malloc(sizeof(struct_t));
和这个
c = malloc(sizeof(struct_t *));
除了避免演员之外,编译器在第二种形式方面是否优先于第一种?或者这两种方式完全相同,只是一个“美学”问题?
答案 0 :(得分:6)
第一个分配sizeof(struct_t)
个字节,第二个sizeof(struct_t*)
个字节。
除此之外,malloc
的作用是否有所不同,无论你是否投射结果。转换结果使得代码可以接受C ++编译器,但它可以隐藏不包括stdlib.h
的错误,因此广泛倾向于不将结果转换为C语言。
答案 1 :(得分:5)
两者完全不同。第一个分配结构的实例,而第二个分配指针到结构。< / p>
通常,它们甚至不会分配相同数量的字节。
答案 2 :(得分:3)
当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 *)。