首页 > 试题广场 >

下面代码打印结果为()union package{ c...

[单选题]
在32位的系统中,下面代码打印结果为()
union package {
    char head;
    int  body;
};
struct message {
    char id;
    int  crc;
    union package pack;
};

int main() {
    printf("size=%d\n",sizeof(struct message));
    return 0;
}
  • 9
  • 10
  • 11
  • 12
UNION变量所占用的内存大小=其中最长成员的内存大小。
union package{
    char head;
    int body;
};
联合体package的最大内存大小是int的内存大小,即4字节。

对于结构体:
struct message{
    char id;
    int crc;
    union package pack;
};
一般默认是4字节对齐的,不足4字节的要补齐到4字节。
(以⚪表示成员本身所占的内存,以×表示补齐的字节。)
××× ⚪ 
char     int              union package
一共12字节。

发表于 2020-09-18 10:36:24 回复(1)
union变量所占用的内存长度等于最长的成员的内存长度。
因为字节对齐的缘故id占4个字节, crc占4个, pack占4个,就共占12个字节
发表于 2019-08-24 22:42:49 回复(1)
首先 id是char型占1个字节,int是4个字节,4>1,所以给id补了3个字节也就是一共8个字节,下面的pack取package里最大的那个也就是int(对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个),4个字节,也就是一共12个字节
发表于 2019-09-08 16:04:59 回复(0)
联合体内存大小为成员中最大内存成员的大小 结构体内存大小一般是以4字节为单位,不够四字节要补齐
发表于 2022-01-29 09:51:13 回复(0)
知识点:联合体的内存是成员最长内存成员的长度。而类和结构体的内存,为所有内存成员的加和,当加和不足四的整数倍时,要补足四的整数倍,这里要注意,当类中有虚函数时,会建立虚函数表,虚函数表需要一个指针来维护,所以如果有虚函数需要额外加一个指针,同时类和结构体中的静态变量不需要计算,因为静态变量存储在静态区
发表于 2022-04-20 16:52:58 回复(0)
需要考虑的是结构体的内存对齐
发表于 2020-01-31 10:33:06 回复(0)

在32位系统中,结构体 message 的大小由其各个成员变量的大小和对齐方式来决定。在这个结构体中,包含一个 char 类型的 id、一个 int 类型的 crc 和一个 union package 类型的 pack。

首先,char 类型通常占用1个字节,int 类型通常占用4个字节。而联合体 union package 中的成员变量 head 占用1个字节,成员变量 body 占用4个字节。

在计算结构体大小时,编译器会对齐成员变量,以保证结构体在内存中的访问效率。在32位系统中,通常采用按照成员变量自身大小进行对齐的方式。

因此,在这个结构体中,id 占用1个字节,但是由于需要按照 int 类型的对齐方式进行对齐,所以会填充3个字节;crc 占用4个字节;pack 中的联合体在32位系统中会按照其中最大的成员变量的大小进行对齐,因此会占用4个字节。

综上所述,结构体 message 的大小为 1 + 3 + 4 + 4 = 12 字节。

发表于 2023-11-07 09:30:06 回复(0)
struct要补到4字节
发表于 2023-01-02 18:43:44 回复(0)
结构体内依次往下看,4(1,补3)+4+4(union最大的)=12
发表于 2021-05-25 18:56:03 回复(0)
union里面,变量都要共用内存大小,structure字符要对齐,char占一个字节,补齐3字节
编辑于 2024-03-18 16:21:02 回复(0)
这题目讲的就是内存对齐,不足4字节的要补齐到4字节,所以是12
发表于 2022-04-12 17:14:32 回复(0)
字节对齐
发表于 2021-11-24 00:29:36 回复(0)
一般默认4字节对齐,所以char型会额外多占用3个字节的空间。
在VS编译环境下,struct类型的数据,按照其成员的最大的基本数据类型对齐,如果题目里面的crc成员是long long 型的数据(8个字节),那结果就是24B。
编辑于 2021-08-11 11:59:20 回复(0)
结构体是4字节对齐的,不足4字节要补齐
发表于 2021-08-05 08:20:48 回复(0)