0
#include <stdio.h>

#define SIZE 10

typedef struct dynArrStruct
{
    double value1;
    int value2;
    int value3;
}dynArr;

int main(int argc, char** argv)
{
    dynArr a1[SIZE];
    dynArr* a2[SIZE];
    printf("Size of a1 array: %d\n", sizeof(a1));
    printf("Size of a2 array: %d\n", sizeof(a2));
    return 0;
}

最初の出力は 160 です。

2 番目は 40 を出力します。

要素ごとに 4 バイトを計算し、2 番目の要素には 10 の要素があります。しかし、最初のものが 160 である理由がわかりません。

ありがとう。

4

3 に答える 3

14

a1は構造体の配列、は構造a2体のポインタの配列です。


a1(10) 個の構造体で構成SIZEされ、メモリ内に連続して配置されます。

----------- ----------- ------- ----------- -----------
| struct0 | | struct1 | | ... | | struct8 | | struct9 |
----------- ----------- ------- ----------- -----------

そのサイズはSIZE * sizeof(dynArr)= 10 * 16 = 160

なぜ構造体ごとに 16 バイトなのですか?

typedef struct dynArrStruct
{
    double value1; // sizeof(double) = 8
    int value2;    // sizeof(int)    = 4
    int value3;    // sizeof(int)    = 4
} dynArr;

それらの合計を取ると、16 バイトになります。(パディングによっては個々のサイズの合計よりも大きい場合もあります)


a2SIZE構造体への(10) 個のポインターで構成され、メモリ内に連続して配置されます。そのサイズはSIZE * sizeof(dynArr*)= 10 * 4 = 40

なぜポインターごとに 4 バイトなのですか?

これは、ほとんどの 32 ビット システムでのポインターのサイズです。

于 2013-02-19T14:23:49.600 に答える
1

あなたのプラットフォームでは、

typedef struct dynArrStruct
{
    double value1;  /* 8 Bytes */
    int value2;     /* 4 bytes */
    int value3;     /* 4 Bytes */
}dynArr;

また、構造要素間にパディング バイトがないこと。

この場合、構造体のサイズは 16 バイトになるため、16 * 10 = 160 となります。

于 2013-02-19T14:24:45.737 に答える
0

a1あなたの場合、構造体の配列です。構造自体のサイズは 16 バイト (double は 8 バイト、int は 4 バイト) であるため、160 バイトのサイズになります。

a2ポインタの配列です。1 つのポインターのサイズは 4 バイト (32 ビット システムのため) であるため、合計サイズは 40 バイトになります。

この時点でa2は初期化されていないことに注意してください。したがって、実際には構造体は含まれていません。構造体へのポインターを格納できる場合は、スペースを保持するだけです。

于 2013-02-19T14:27:00.580 に答える