0

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

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

和这个

c = malloc(sizeof(struct_t *));

除了避免强制转换之外,编译器在第二种形式方面是否利用了第一种形式?或者这两种方式完全一样,只是一个“审美”问题?

4

5 回答 5

6

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

除此之外malloc,无论您是否投射结果,都没有什么区别。转换结果使得代码可以被 C++ 编译器接受,但它可以隐藏不包含的错误stdlib.h,因此人们普遍倾向于不在 C 中转换结果。

于 2013-03-12T10:06:59.773 回答
5

两者完全不同。第一个分配结构的实例,而第二个分配指向结构的指针

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

于 2013-03-12T10:07:23.510 回答
3

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

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

于 2013-03-12T10:08:24.133 回答
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
}
于 2013-03-12T14:28:55.867 回答
0

两者是不同的。

通常 malloc 返回 (void*)。因此,您想将 void* 类型转换为 (struct_t*)。

于 2013-03-12T12:06:25.447 回答