我想知道这两者之间是否有真正的区别:
c = (struct_t *) malloc(sizeof(struct_t));
和
c = malloc(sizeof(struct_t *));
除了避免强制类型转换外,编译器是否在第二种形式中利用了第一种形式的优势?或者这两种方式完全相同,只是一个"美学"问题?
第一个分配sizeof(struct_t)
字节,第二个分配sizeof(struct_t*)
字节。
除此之外,malloc
所做的事情没有区别,无论您是否投射结果。强制转换结果使代码可以被c++编译器接受,但它可以隐藏不包含stdlib.h
的错误,因此普遍建议不要在C中强制转换结果。
两者完全不同。第一个为该结构体分配一个实例,第二个为该结构体分配一个指针。
通常,它们甚至不会分配相同数量的字节
不,它们不一样。后者为指向结构体的指针分配4或8个字节的空间,前者为结构体本身分配足够的空间。
当sizeof(struct_t)足够小,并且malloc分配的空间实际多于请求时,用户可能看不到差异
两种形式不同。它们都分配内存,但数量不同。一般规则如下:当分配类型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
}
两者不同
通常malloc返回(void*)。因此,您需要将void*类型转换为(struct_t*)。