这行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)刚刚声明后会返回什么?
答案 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返回和使用。