首页 > 试题广场 >

在x86系统下,sizeof如下结构体的值是多少?

[单选题]
在x86系统下,sizeof如下结构体的值是多少?
struct{ 
char a[10];
int b;
short c[3];
}
  • 20
  • 22
  • 24
  • 26
推荐
答案是C
          相对简单的内存对齐,需要注意的是char a[10];并不是代表结构体需要对齐最长的长度是10,它只是10个char聚在一起,本质没有变化
所以说,需要对齐的最大长度还是4,故4(char a[4])+4(char a[4]) +4(char a[2] 由于内存对齐为4)+4(int)+4(short[2])+4(short[1]内存对齐为4)=6*4=24
编辑于 2015-11-07 16:30:38 回复(3)
发表于 2016-03-07 20:05:12 回复(7)
结构体在内存中存储为矩形
发表于 2016-01-19 21:40:56 回复(0)
偏移量必须为其类型的整数倍,结构体大小必须是所有成员大小的整数倍
char 偏移量0,地址0-9
int    偏移量10不是sizeof(int)的倍数,故而修正为12,地址12-15
short 偏移量16,地址16-21
结构题大小22不是1,2,4的公倍数,故而vc自动补充2个数为24
发表于 2015-11-11 22:01:20 回复(8)
struct{ 
chara[10];  //10字节,补齐以后占12字节
intb;       //4字节
shortc[3]; //6字节,补齐后占8字节
}       //总共:12+4+8 = 24

发表于 2016-08-05 20:01:21 回复(0)
X86表示32位机,内存对齐4个字节对齐或8个字节对齐均为24
若为8字节对齐
char占用1字节,a[10]占用10个字节,拆分为8+2,
int占用4个字节,4+2 < 8,偏移地址位于字符数组后,
short占用2个字节,2*3 < 8
则   8  |  2 + 4  |  6  对齐为 8  |  8  |  8
若为4字节对齐
char  4 + 4 + 2 
int 4 
short 4 + 2
即 4 + 4 + 2 | 4 | 4 + 2对齐为  4  |  4  |  4  |  4  |  4  |  4  
发表于 2017-08-10 19:06:10 回复(0)
 x86下默认对齐数是8
结构体内存对齐规则:
1、第一个成员变量在与结构体变量偏移量为0的地址处
2、其他成员变量要对齐到相应变量对齐数的整数倍的地址处
对齐数=编译器默认的一个对齐数与该成员大小的较小值
3、结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍
4、如果嵌套了结构体,潜逃的结构体对齐到自己的最大对齐数的整数倍,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍
发表于 2019-04-22 20:59:58 回复(1)
内存对齐机制,则不同类型的内存段需要相同大小。需要为最大字节数类型的倍数,这里以int 的4字节为基数。
char a[10] 10+2=4*3=12
int b  4
short c[3] 2*3+2=4*2=8
总共 12+4+8=24
编辑于 2021-05-31 11:06:07 回复(0)
结构体分配内存,偏移量为本次分配类型的整数倍,最后内存大小为各类型公倍数
发表于 2015-11-23 16:18:18 回复(0)
内存对齐规则:
结构体第一个成员默认偏移量为0,根据变量类型得大小可以确定后续偏移量。如:
char a[10];     偏移量为0,大小为10,总共长度为10,占的总的字节为:1 * 10 = 10;
int b;              相对应第一个的偏移量为10,int类型占为4个字节,而偏移量必须是类型的整数倍,偏移加2变为12,此时占的总的字节为:12+4=16;
short c[3];      相对于第一个的偏移量为16(是2的整数倍),2(short为两个字节) * 3  = 6 ,占的总的字节为:16+6 = 22
结构体大小必须是各类型中最大字节数的整数倍。此处最大字节数类型为int类型即4字节,因此补充两个2字节,即22+2 = 24。
发表于 2022-06-02 15:35:47 回复(0)
char a[10];   --->  10字节
int b;  ---> 4字节
到这里共14字节, 
14 % 4 == 0 ? , no
需要补2个字节, 16字节
short c[3];  ---> 2 * 3 = 6字节
共22字节
22 % 2 == 0 yes
22 % 4 == 0 no
需要补2个字节, 即24字节
发表于 2022-06-23 17:58:12 回复(1)

关于结构体存储字节对齐问题,存储变量时地址要求对齐,编译器在编译程序时会遵循两条原则:

      (1)结构体变量中成员的偏移量必须是成员大小(指成员的数据类型的大小)的整数倍(0被认为是任何数的整数倍) 

      (2)结构体大小必须是所有成员大小的整数倍,也即所有成员大小的公倍数

发表于 2018-06-15 19:55:41 回复(0)
window平台下和Linux平台还是有区别的。Windows下面是和字节自己对齐,Linux除了2字节和4字节以外就没有其他的8字节对齐了。虽然不影响本题目的答案。
编辑于 2017-12-31 16:25:10 回复(0)
注意内存对齐原则,另外
sizeof(char) = 1
sizeof(short) = 2
sizeof(int) = 4
编辑于 2015-11-19 10:52:15 回复(0)
结构体成员变量的对齐规则,默认为8,此处int最大为4字节,所以对齐数为4,char数组的偏移量为0-9,10和11空缺,b的偏移为12-15,short数组的偏移为16-21,22个字节不是4的整倍数,所以补齐为24个字节
发表于 2024-01-12 00:39:27 回复(0)
内存对齐
发表于 2021-03-19 13:16:13 回复(0)
x86架构下32位4字节,而且还有边界对齐。
发表于 2021-02-20 08:32:53 回复(0)
12+4+8=24字节,故选C。
发表于 2018-11-18 19:23:12 回复(0)
#include<iostream>
using namespace std;

//内置类型
struct stru1
{
    char a;
    short b;
    double c;
    int* p;
};
//含数组
struct stru2
{
    char a;
    short b[10];//数组必须连续存储,但当前偏移为 1,而short为2,因此char加1
    double c;
    char d[10];
    int* p;
};
//结构体嵌套
struct stru3
{
    char a;
    short b[10];
    double c;
    char d[10];
    //struct stru5
    //{
    //    char a;
    //    short b[10];//数组必须连续存储,但当前偏移为1,而short为2,因此char加1
    //    double c;
    //    char d[10];
    //    int* p;
    //}e;//看做不展开,如下句。
    stru2 e;//stru2为48,而当前偏移量为42,因此42+6
    int* p;//96+4=100不是double 8的倍数+4=104
};

int main()
{
    cout << "stru1的对象为 24-------"<<sizeof(stru1) << endl;
    cout << "stru2的对象为 48-------" << sizeof(stru2) << endl;
    cout << "stru3的对象为104-------" << sizeof(stru3) << endl;
    return 0;
}

发表于 2017-10-31 22:20:45 回复(0)
x86中内存对齐为4
发表于 2017-08-30 17:04:56 回复(2)
short类型表示整型,占2个字节,int占四个字节,char占一个字节,结构体的值为类型字节最大值整数倍,由内存对其规则可得24
发表于 2017-04-20 17:32:10 回复(0)