我的结构数组的大小不同......为什么?

时间:2013-02-19 14:22:17

标签: c struct sizeof

#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.

感谢。

3 个答案:

答案 0 :(得分: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位系统上指针的大小。

答案 1 :(得分:1)

在您的平台上假设

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

并且结构元素之间没有填充字节。

然后,结构的大小将是16个字节,因此16 * 10 = 160

答案 2 :(得分:0)

在您的情况下,

a1是一组结构。结构本身的大小为16字节(double为8 Byte,int为4 Byte),因此您可以获得160字节的大小。

a2是一个指针数组。一个指针的大小为4个字节(由于您的32位系统),因此总大小为40个字节。

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