来自某个地方的问题要求标注这个结构部件的大小,我不知道如何通过初始化来说明大小。对答案的任何解释都会有所帮助。 如果有帮助,系统是32位。
sizeof( struct Artist_A )
?sizeof( artist_record )
?sizeof( artist_record[1].record )
? sizeof( artist_record[1].group )
?
struct Artist_A {
short group;
char title[20];
union Rec{
void * ptr;
int num;
char character;
double real;
} record;
};
struct Artist_A artist_record[200];
答案 0 :(得分:1)
分配给联合的内存量足以容纳联盟中最大的成员。在32位系统上的示例中,您将拥有32个字节的大小。它细分如下:
i686 Linux(Ubuntu)上的sizeof(Artist_A)
确认了这一点
答案 1 :(得分:1)
这是您在GCC编译器上获得此代码的结果,
truct Artist_A {
short group;
char title[20];
union Rec{
void * ptr;
int num;
char character;
double real;
} record;
};
struct Artist_A artist_record[200];
int main(){
/* %zu is used as sizeof() returns std::size_t */
printf("%zu\n",sizeof( struct Artist_A ));
printf("%zu\n",sizeof( artist_record ));
printf("%zu\n",sizeof( artist_record[1].record ));
printf("%zu\n",sizeof( artist_record[1].group ));
}
输出:
32
6400
8
2
这些是必需的字节!
阐释:
struct Artist_A
:
short group
:简称为4,即使短只需要2个字节Data structure alignment
!数据对齐意味着将数据放在存储器偏移量等于字大小的某个倍数。在32位系统中,字大小为4字节(而在x64中则为8字节)。这实际上提高了性能。
char title[20]
:取20个字节,即char为20个元素的一个字节。
uinion record
:根据官方文档,联盟只有保留其最大数据成员所需的大小。所以它又增加了8个字节。答案 2 :(得分:0)
联盟至少其最大成员的大小;它可能更大以满足任何对齐要求(例如,如果union的最大成员是char
的17元素数组,但系统需要4字节对齐,那么并集的大小可能是填充到20个字节。
类似地,结构的成员之间可能存在填充,也是为了满足对齐要求;因此,sizeof
报告的大小可能大于各个成员的大小总和。
因此,union Rec
至少与real
成员一样大,在32位系统上最可能是8个字节。因此struct Artist_A
至少为8 + 20 + sizeof (short)
,至少为2;假设它是30个字节,可能还有2个额外的填充字节,总共为32个字节。