c -一个结构体的两个malloc定义的区别



我想知道这两者之间是否有真正的区别:

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*)。

相关内容

  • 没有找到相关文章

最新更新