2013-02-19 106 views
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; 
} 

第一打印出160sizeof我的结构数组是不同的...为什么?

第二打印出40.

我的数字元件每4个字节,存在用于第二一个10个元素。但我不明白为什么第一个有160.

谢谢。

+1

你可以打印出'sizeof(double)'和'sizeof(int)'并加起来。 – timrau 2013-02-19 14:24:24

+0

你从哪里得到元素大小为4的想法?尝试打印'sizeof(dynArr)'。 – 2013-02-19 14:24:52

回答

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

假设你的平台上,这

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

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

然后,该结构的大小将是16个字节,所以16×10 = 160

0

a1是你的情况的结构的阵列。该结构本身的大小为16字节(double是8字节,int是4字节),所以你得到160字节的大小。

a2是一个指针数组。一个指针的大小是4字节(由于你的32位系统),所以你得到的总大小为40字节。

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

相关问题