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.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 を保持するのに十分な大きさのメモリ ブロックを割り当てる」と言っています。2番目のケースでは、「retが指すものを保持するのに十分な大きさのメモリブロックを割り当てる」と言っています。どちらを好むかは、ほとんど好みの問題です。

于 2012-07-07T17:18:44.313 に答える
1

sizeof は、データ型と実際の変数の両方で機能します。あなたの場合、変数をパラメーターとして呼び出します。sizeof を呼び出すまでに、変数は宣言されている (初期化されていないが宣言されている) ため、var の型を認識し、malloc によって返されて使用されるメモリ要件をバイト単位で計算できます。

于 2012-07-07T17:19:40.130 に答える