我想知道这之间是否有真正的区别:
c = (struct_t *) malloc(sizeof(struct_t));
和这个
c = malloc(sizeof(struct_t *));
除了避免强制转换之外,编译器在第二种形式方面是否利用了第一种形式?或者这两种方式完全一样,只是一个“审美”问题?
我想知道这之间是否有真正的区别:
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*)。