5

タイトルが紛らわしくてすみません。これが私の構造体です:

struct l_list{
   int number;
   char *name;
   double value;
   struct l_list *next;
};

typedef struct l_list *PhoneBook;

主な機能:

int main(void){

   printf("%u\n", sizeof(struct l_list));

   PhoneBook person1;

   printf("%u\n", sizeof(*person1));
   printf("%u\n", sizeof(PhoneBook));

   return 0;
}

出力は次のとおりです。

20
20
4

pointerPhoneBookのサイズだけなので 4 バイトが表示されていることは理解していますが、実際の構造体のサイズをから調べるにはどうすればよいですか?typedef PhoneBook

4

3 に答える 3

7

以下を使用できます。

printf("%zu\n", sizeof( *(PhoneBook)NULL ) );

重要な質問は、なぜ上記が有効なのかということです。未定義の動作になるポインター間接化​​を実行していませんか? いいえ、可変長配列を除いてまったく評価されないため、そうではありません。C99 ドラフト標準セクションを見ると、sizeof 演算子の段落2には次のように書かれています (強調鉱山):NULL sizeof6.5.3.4

sizeof 演算子は、そのオペランドのサイズ (バイト単位) を生成します。これは、式または括弧で囲まれた型の名前の場合があります。サイズは、オペランドの型から決定されます。結果は整数です。オペランドの型が可変長配列型の場合、オペランドが評価されます。それ以外の場合、オペランドは評価されず、結果は整数定数になります。

さらに、パラグラフ5に次の例があり、この読みを確認しています。

double *dp = alloc(sizeof *dp);

コンパイル時に、結果を計算するために式の型が決定されます。次の例でこれをさらに実証できます。

int x = 0 ;
printf("%zu\n", sizeof( x++ ));

増加しませんx

:%zuは、プラットフォームに依存しない、結果の書式指定子ですsizeof

于 2013-10-30T02:53:36.720 に答える