1

以下のプログラムをテストします。

#include <stdio.h>
#include <stdlib.h>

typedef struct _node_t {
    int id;
    int contents[0];
}node_t;

int
main(int argc, char* argv[])
{
    printf("sizeof node_t is: %d\n", sizeof (struct _node_t)); // output: 4

    node_t *node = (node_t*)malloc(sizeof(node_t) + sizeof(int) * 3);

    printf("sizeof node is: %d\n", sizeof (node)); // output: 8

    return 0;
}

ノードインスタントのサイズは 8 です。ただし、malloc関数では、構造体に 3 つの整数を追加しますnode。ノードサイズの出力がまだ8であるのはなぜですか?

PS: gcc (GCC) 4.6.3 20120306 (Red Hat 4.6.3-2)

4

2 に答える 2

7

sizeof() は、型のサイズを返すコンパイル時の「演算子」であるためです。何を malloc() したかはわかりませんし、気にすることさえありません。

編集:さらに、2回目の試行でポインターのサイズを取得しています:-)おそらく「sizeof(* node)」のようなものを使用するつもりでした。これにより、「4」が再び与えられます。

編集 2: これは、'Pointer' が初期化されていない場合や無効な場合でも、 sizeof(*Pointer) または sizeof(Pointer->Element) のようなことを実行できる理由でもあります。sizeof() は何の内容も気にせず、式の結果の型を調べるだけです。

于 2012-09-18T10:42:58.687 に答える
3

まず、 Cの戻り値をキャストしないでくださいmalloc()

2 番目:型名を繰り返さないmalloc()方が良いですが、代わりに:ed ポインターを割り当てている左側のポインターを使用します。これには既に型があるためです。したがって:

node_t *node = malloc(sizeof *node + 3 * sizeof(int));

このコードでは、sizeof演算子式の評価はコンパイル時に行われるため、コードの実行から得られる情報はありません。

C99 以降、 の部分実行時評価を取得することが可能になりました。このウィキペディアのテキストsizeofを参照してください。与えられた最も基本的な例は次のとおりです。

size_t flexsize(int n)
{
   char b[n+3];      /* Variable length array */
   return sizeof b;  /* Execution time sizeof */
}

sizeofの正確な値nは定数ではなく、コンパイル時には不明であるため、上記では の実行時評価が必要です。上記は、C99 より前のバージョンの C ではコンパイルできません。

于 2012-09-18T11:07:33.217 に答える