首页 > 试题广场 >

32位机器上,以下结构的sizeof(P)为struct A

[单选题]
32位机器上,以下结构的sizeof(P)为()
struct A {
    int a;
    char b;
    int c;
    char d;
};
struct P {
    struct A w[2];
    short b;
    struct A* p;
}


  • 26
  • 38
  • 40
  • 30
/*考察结构体对齐和填充:
结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如果不是,编译器会自动在成员间填充。*/
struct A {
int a;                            //4 bytes
char b;                        //1 bytes
//char pad[3]               //3 bytes
int c;                           //4 bytes
char d;                       //1 bytes
//char pad[3]              //3 bytes
}                            // total = 16 bytes

/* P中有结构体A的成员,但是计算时按照A中数据类型确定的*/

struct P {
struct A w[2];    // 2 * 16 bytes
short b;            //2 bytes
//char pad[2]    //2 bytes
struct A* p;      //4 bytes
}  // total = 40 bytes
发表于 2018-09-07 07:39:24 回复(10)
整形4字节 字符1字节 short2字节 指针地址4字节 但是结构体中按照最大的成员变量划分空间,比如结构体A中最大成员为int,char类型系统会补足3字节空间
发表于 2021-09-16 20:45:44 回复(0)

A的字节大小:

4,1,4,1,》》4,4,4,4,--》》16字节

P的字节大小:

16*2,2,4》》32,4,4》》40字节 (A的成员最大字节是4)

 

变式:

struct A {

int a;

char b;

int c;

char d;

long long l;

};//4 1 4 1 8 >>24

struct P {

struct A w[2];

short b;

struct A* p;

};//48 2 4 >> 48 4 4 >>56 (满足long long 8的倍数)

发表于 2020-07-21 20:44:49 回复(0)
/*考察结构体对齐和填充:
结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如果不是,编译器会自动在成员间填充。*/
struct A {
int a;                            //4 bytes
char b;                        //1 bytes
//char pad[3]               //3 bytes
int c;                           //4 bytes
char d;                       //1 bytes
//char pad[3]              //3 bytes
}                            // total = 16 bytes

/* P中有结构体A的成员,但是计算时按照A中数据类型确定的*/

struct P {
struct A w[2];    // 2 * 16 bytes
short b;            //2 bytes
//char pad[2]    //2 bytes
struct A* p;      //4 bytes
}  // total = 40 bytes
发表于 2022-05-16 20:14:31 回复(0)
struct P {
    struct A w[2];
    short b;
    struct A* p;
}

这题目不对吧,和解释里少两个char类型的数据

发表于 2022-09-21 14:07:16 回复(0)
我考虑过struct A的16作为最长 结果还是按int最长算的
发表于 2022-04-09 00:08:31 回复(0)
结构体指针只占4个字节吗
发表于 2020-12-06 22:51:16 回复(4)
在32位机器上,结构体的对齐规则依赖于其成员的对齐要求。对于这个特定的例子,我们需要考虑每个成员的大小以及结构体的对齐规则。 首先,我们来看`struct A`的大小: - `int a;`:`int`类型通常在32位机器上占4字节。 - `char b;`:`char`类型占1字节,但是为了满足`int`的对齐,后面会有3字节的填充。 - `int c;`:同`int a;`,占4字节。 - `char d;`:`char`类型占1字节,由于`struct A`结束后没有对齐要求,如果单独考虑`struct A`,这里不会有额外的填充。但是在数组中或其他结构体中可能会有填充以保证整个结构体或数组的对齐。 因此,`struct A`单独考虑时大小为:4 + 1 + 3(填充) + 4 + 1 = 13字节。但是,由于结构体对齐的需要,`struct A`实际上会被对齐到4字节边界,使得其大小为16字节。 接下来,我们看`struct P`: - `struct A w[2];`:`struct A`的大小为16字节,数组有2个元素,因此占用32字节。 - `short b;`:`short`类型占2字节,在32位机器上通常对齐到2字节。在`struct A w[2];`之后,直接添加`short b;`不需要额外填充。 - `struct A* p;`:指针在32位机器上占4字节。 因此,`struct P`的大小为:32 (对于`w[2]`) + 2 (对于`short b`) + 2 (对于`short b`后面的填充,以确保`struct A* p;`的对齐) + 4 (对于`struct A* p;`) = 40字节。 所以,`sizeof(P)`为40字节。
发表于 2024-05-07 12:10:29 回复(0)
我想问下,如果结构体A大小时17,那么计算下面结构体B时,17要补齐为4的倍数吗
发表于 2022-09-27 14:04:06 回复(1)