若struct teacher{
int num;
char name[10];
char sex;
int age;
float score;}teacher1;
则变量teacher1所占用的内存字节是( )
A.25 B.24 C.19. D.20
int num:4 字节 char name[10]:10 字节 char sex:1 字节 int age:4 字节 float score:4 字节 总共是 23 字节,但实际占用的内存会因对齐而增加,通常是 24 或 28 字节。具体数值取决于编译器的对齐策略。
4+10+1+4+(1)+4=24
计算结构体大小时需要考虑其内存布局,编译系统为了提高计算机访问数据的效率,在安排结构体每个成员的时候采用了内存对齐的方法,具体是:结构体在内存中的存放按单元进行存放,每个单元的大小取决于结构体中最大基本类型的大小。 例如:
格式一:
struct tagPhone{
char A;
int B;
short C;
}Phone1;
格式二:
}Phone2;
格式三:
struct tagPhone3{
char B[2];
char C[4];
}Phone3;
格式四:
double B[2];
}Phone4;
然后我们一一分析
在 C 语言中,数据对齐通常是按照特定类型的自然边界进行的。对于 int 和 float 类型,它们的自然边界通常是 4 字节(这取决于具体的系统和编译器)。这意味着这些类型的数据会被放置在内存中地址是 4 的倍数的位置。这样做可以提高内存访问的效率。
int
float
对于结构体,其对齐规则通常是按照其最大成员的对齐要求进行的。所以,即使结构体中有一个占用 10 字节的 char 数组,但由于 int 和 float 类型的成员的对齐要求,结构体的大小可能会被对齐到 4 的倍数。
char
"最大成员的对齐要求"是指结构体中占用内存最大的数据类型的对齐要求。在这个上下文中,“最大"并不是指占用的字节数最多,而是指对齐要求最严格的数据类型。例如,int 和 float 类型通常需要在 4 字节的边界上对齐,而 char 类型只需要在 1 字节的边界上对齐。因此,即使 char 数组的总字节数可能比单个 int 或 float 类型的字节数多,但 int 或 float 类型仍然被视为结构体的"最大成员”,因为它们的对齐要求更严格。
特讨厌这种不注明平台的字节题
快乐小土狗 回复 hello@noobdream: 一般没特别注明默认是32位的,即int是4个字节
结构体变量的总大小,为结构体变量中“最大基本数据类型成员所占字节数”的整数倍(补齐)
结构体所占总字节数是其最大成员类型的整数倍,这题不需要取整到30吗
xie 回复 xie: 4+10+(2)+4+4=24
ZzwZzw 回复 xie: (2)是什么意思
Masud 回复 ZzwZzw: 结构体补全的2
答案错了 应该是24
admin 回复 2375725034: 感谢提醒,已修正
B
字节对齐如下图
用户登录可进行刷题及查看答案
登录后提交答案