#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.
感谢。
答案 0 :(得分:14)
a1
是一个结构数组,a2
是一个结构指针数组。
a1
由SIZE
(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个字节。 (甚至可能超过个别大小的总和,取决于填充)
a2
由SIZE
(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
未初始化。所以它并不真正包含你的结构它只是保留了一些空间,你可以存储指向你的结构的指针。