38

Cでは、次のように定義された構造体の配列があります。

struct D
{
    char *a;
    char *b;
    char *c;
};

static struct D a[] = {
    {
        "1a",
        "1b",
        "1c"
    },
    {
        "2a",
        "2b",
        "2c"
    }
};

配列内の要素の数を確認したいのですがsizeof(a)、2ではなく48という誤った結果が返されます。何か間違ったことをしているのでしょうか、それともsizeof単に信頼できないのでしょうか。重要な場合は、GCC4.4でコンパイルしています

4

4 に答える 4

50

sizeof要素の数ではなく、バイト単位のサイズを示します。Alokが言うように、要素の数を取得するには、配列のバイト単位のサイズを1つの要素のバイト単位のサイズで除算します。正しいCイディオムは次のとおりです。

sizeof a / sizeof a[0]
于 2009-12-14T02:34:06.847 に答える
48
sizeof a / sizeof a[0];

これはコンパイル時定数であるため、たとえば、別の配列を作成するために使用できます。

#define N sizeof a / sizeof a[0]
int n_a[N];
于 2009-12-14T02:31:50.533 に答える
11

sizeof渡された要素のメモリ内のサイズを返します。配列のサイズを単一の要素サイズで割ると、要素数がわかります。

要素サイズには、いくつかのパディングバイトも含まれる場合があることに注意してください。このため、パディングされた構造体(たとえば、charメンバーの後にポインターが続く場合)のsizeof値は、メンバーのサイズの合計よりも大きくなります。

一方、配列内の要素を数えるときは気にしないでくださいsizeof(a) / sizeof(a[0])。期待どおりにスムーズに機能します。

于 2009-12-14T06:12:44.973 に答える
-3

ssize_t portfoySayisi = sizeof(* portfoyler);

これはうまくいく

于 2021-05-11T20:36:33.393 に答える