在这种情况下,malloc做了什么?

时间:2012-07-07 17:11:57

标签: c parsing

这行C代码有什么作用?

      be_node *ret = malloc(sizeof(*ret));

be_node的定义可以在这个文件中找到:http://funzix.git.sourceforge.net/git/gitweb.cgi?p=funzix/funzix;a=blob_plain;f=bencode/bencode.h;hb=HEAD

上面的代码行在此文件中找到:http://funzix.git.sourceforge.net/git/gitweb.cgi?p=funzix/funzix;a=blob_plain;f=bencode/bencode.c;hb=HEAD

我不明白sizeof(* ret)刚刚声明后会返回什么?

4 个答案:

答案 0 :(得分:11)

sizeof的任何其他用法没有什么不同;它将评估其操作数的大小。 sizeof基于编译时信息 1 ,因此ret刚刚被声明无关紧要。

这个习语是使用malloc的首选方式。如果您使用be_node *ret = malloc(sizeof(be_node)),请考虑如果您在以后更改ret的类型会发生什么。如果您忘记更换“be_node”的两种用法,那么您将引入一个微妙的错误。

<小时/> <子> 1。除了可变长度数组的情况外。

答案 1 :(得分:2)

sizeof(*ret)由编译器解析,只查看*ret的类型,而不是其内容。在这种情况下,它是be_node的大小。它也在编译时得到解决,而不是在运行时解析,因此它本身不会“返回”,它只会被常量替换。

编译器将取出sizeof(*ret)并以字节为单位替换be_node的常量数。

答案 2 :(得分:1)

这是一条捷径,或者你可能想要的任何东西。

你可以写

be_node *ret = malloc(sizeof(be_node));

be_node *ret = malloc(sizeof(*ret));

在第一种情况下,你基本上是在说“分配足够大的内存块以容纳be_node”。在第二种情况下,你说“分配一个足够大的内存块来保存任何转发点”。你喜欢哪一个主要是偏好问题。

答案 3 :(得分:1)

sizeof适用于数据类型和实际变量。在您的情况下,您使用变量作为参数调用它。当你调用sizeof时,变量是DECLARED(未初始化但声明),因此它将知道var的类型,并且能够以字节为单位计算内存需求,这些内容将由malloc返回和使用。