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。

第二个打印出 40。

我计算每个元素 4 个字节,第二个元素有 10 个元素。但我不明白为什么第一个有 160。

谢谢。

4

3 回答 3

14

a1是一个结构数组,a2是一个结构指针数组。


a1SIZE(10) 个结构组成,在内存中连续布局。

----------- ----------- ------- ----------- -----------
| 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是一个指针数组。一个指针的大小为 4 字节(由于您的 32 位系统),因此您得到的总大小为 40 字节。

请记住,此时a2未初始化。所以它并不真正包含你的结构,它只是保留一些空间,你可以存储指向你的结构的指针。

于 2013-02-19T14:27:00.580 回答