4

这行 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

4 回答 4

11

它与 ; 的任何其他用途没有什么不同sizeof。它将评估其操作数的大小。 sizeof是基于编译时信息的,1ret所以刚刚声明没关系。

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


1. 可变长度数组的情况除外。

于 2012-07-07T17:16:32.037 回答
2

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

编译器将取出并替换为字节sizeof(*ret)大小的常数。be_node

于 2012-07-07T17:16:45.933 回答
1

这是一个快捷方式,或者任何你可能想要调用的方式。

你可以写

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

或者

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

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

于 2012-07-07T17:18:44.313 回答
1

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

于 2012-07-07T17:19:40.130 回答