首页 > 试题广场 >

在64位处理器上运行后sz的值是什么?

[单选题]
struct st{
    int *p;
    int i;
    char a;
};
int sz = sizeof(struct st);
如下C程序,在64位处理器上运行后sz的值是什么?
  • 24
  • 20
  • 16
  • 14
  • 13
  • 12
考点:1.struct的对齐原则,注意不同的编译器有不同的效果。
2。不同的数据类型在32位和64位下所占字节的区别

32位编译器:

      char :1个字节
       char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
      short int : 2个字节
      int: 4个字节
      unsigned int : 4个字节
      float: 4个字节
      double: 8个字节
      long: 4个字节
      long long: 8个字节
      unsigned long: 4个字节

  64位编译器:

      char :1个字节
      char*(即指针变量): 8个字节
      short int : 2个字节
     int: 4个字节
      unsigned int : 4个字节
      float: 4个字节
      double: 8个字节
      long: 8个字节
      long long: 8个字节

      unsigned long: 8个字节

 此处指针先占用8字节。int占用4字节,满足要求不用补齐,char占用一个字节,同时总的字节数必须满足8的倍数即16


发表于 2016-05-22 22:08:28 回复(11)
结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的"最宽基本类型成员"的整数倍.不足的要补齐.
发表于 2016-07-29 15:06:34 回复(4)
32,64位编译环境下的sizeof问题经常出现。
不过,两者环境下的数据类型所占字节数都是一样的,

char:1字节;

short:2字节;

int:4字节;

long:4字节;

long long:8字节;

float:4字节;

double:8字节;

long double:8字节;

唯一不同的是:指针类型
32位:指针类型占4个字节
64位:指针类型占8个字节

所以,本题中,st占 8 +8=16字节。其中,为了字节对齐,int 和char 需要补齐到8个字节

发表于 2016-08-26 16:08:58 回复(4)
准备知识:结构体中一个成员的偏移量是这个成员前面所有字节之和(包含补上的字节)

对于单层结构体要遵循下面2个原则:
(1)结构体变量中每个成员的偏移量都要是其自身大小的整数倍(第一个成员直接不用看可以,因为其偏移量为0,而任何数的0倍都是0),不是整数倍要在上一个成员后面补字节.
(2)结构体大小(包含补上的字节大小)必须是所有成员大小(成员自身大小,不包含在其后面补上的字节)的整数倍,也即所有成员大小的公倍数。不是整数倍要在最后一个成员后面补字节

就这题来说,第二个成员的偏移量是8,而其自身大小是4,是整数倍不用补字节,第三个成员的偏移量是12,而其自身大小是1,为整数倍不用补字节,结构体总大小目前为13,但是要是8,4,1的整数倍,所以就在最后一个成员后面补上3个字节,这样总的大小变成16,就是8,4,1的整数倍了.

扩展:

对于嵌套的结构体需要将其展开。对结构体求sizeof时,上述两种原则变为:

(1)展开的子结构体中的第一个成员的偏移量应当是父结构体中除子结构体外最大成员大小的整数倍。
(2)结构体大小必须是所有成员大小的整数倍,这里所有成员计算的是展开后的成员,而不是将子结构体当做一个整体。
编辑于 2017-08-11 17:23:14 回复(2)
64位上指针为8字节,偏移量即为8,第二个数为int 占4个字节,偏移量8刚好是4的倍数因此不需要填充,第二个数后偏移量变为12,char一个字节,不需要填充,因此总的字节数为13,不是8的倍数,因此需要填充3个字节,变成16.
发表于 2016-05-08 13:00:47 回复(4)
struct作为一个数据结构,所占的字节数必须是8的倍数,8+4+1=13需要补齐到16
发表于 2017-09-14 01:10:46 回复(0)
64位上指针为8字节,偏移量即为8,第二个数为int 占4个字节,偏移量8刚好是4的倍数因此不需要填充,第二个数后偏移量变为12,char一个字节,不需要填充,因此总的字节数为13,不是8的倍数,因此需要填充3个字节,变成16.
发表于 2021-04-01 16:57:56 回复(0)
64位下,不管什么类型的指针都是8,32位是4
int 64位是4,
char是1
所以是 8 + 4+1+(3)=16,按最高对齐,不足就补


发表于 2021-03-20 19:41:29 回复(0)
此原则是在没有#pragma pack语句作用时的原则(不同平台可能会有不同):

原则A:struct或者union的成员,第一个成员在偏移0的位置,之后的每个成员的起始位置必须是当前成员大小的整数倍;

原则B:如果结构体A含有结构体成员B,那么B的起始位置必须是B中最大元素大小整数倍地址;

原则C:结构体的总大小,必须是内部最大成员的整数倍;
发表于 2016-09-26 11:25:28 回复(0)
这是说cup64位还是寻址能力64位,平时我们说的64位是指cup计算能力,一次可计算64位,但是和寻址能力无关,寻址能力有地址总线位数决定,是不是出题人也被网上的言论迷惑了?
发表于 2016-08-07 08:44:39 回复(1)
对齐规则1:结构体中的每个成员必须存放在该成员大小的整数倍偏移处。
对齐规则2:结构体大小必须是其最大元素的整倍数。
发表于 2022-11-28 21:25:41 回复(0)
32,64位编译环境下的sizeof问题经常出现。
不过,两者环境下的数据类型所占字节数都是一样的,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
char:1字节;
 
short:2字节;
 
int:4字节;
 
long:4字节;
 
longlong:8字节;
 
float:4字节;
 
double:8字节;
 
longdouble:8字节;
唯一不同的是:指针类型
32位:指针类型占4个字节
64位:指针类型占8个字节
发表于 2017-04-02 22:41:14 回复(0)
这些题目出的也是让人无语:
有些需要补齐,有些不需要补齐。所以补齐是16不补齐是13。
有些按4字节补齐,有些按1字节。你出个题也不讲清楚这些问题坑死

发表于 2016-07-25 19:07:13 回复(3)
各位注意是64位机,一个指针是占8位!!!!!!!!!!!!!!!!
发表于 2016-06-25 10:06:22 回复(2)
64位系统中指针大小为8  
发表于 2016-05-05 20:19:52 回复(2)
内存对齐原则 int* 8 int 4 char 1 补3 8+8=16
发表于 2022-10-24 11:38:42 回复(0)
64位系统,指针位8字节 int 4字节 char1字节,一共13自己,,但是结构需要对齐,总的字节数要是结构体内最大字节数的整数倍,,所以13变成16
发表于 2022-09-24 01:57:09 回复(0)
考点:1.struct的对齐原则,注意不同的编译器有不同的效果。
2。不同的数据类型在32位和64位下所占字节的区别

32位编译器:

      char :1个字节
       char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
      short int : 2个字节
      int: 4个字节
      unsigned int : 4个字节
      float: 4个字节
      double: 8个字节
      long: 4个字节
      long long: 8个字节
      unsigned long: 4个字节

  64位编译器:

      char :1个字节
      char*(即指针变量): 8个字节
      short int : 2个字节
     int: 4个字节
      unsigned int : 4个字节
      float: 4个字节
      double: 8个字节
      long: 8个字节
      long long: 8个字节

      unsigned long: 8个字节

 此处指针先占用8字节。int占用4字节,满足要求不用补齐,char占用一个字节,同时总的字节数必须满足8的倍数即16

发表于 2022-05-02 14:56:20 回复(0)
struct的对齐规则:先对struct的所有成员进行sizeof求和,像这道题 8 + 4 + 1 = 13,然后在找出其中sizeof最大的成员,就是int *p,值为8,所以sizeof(struct)的值必须是8的整数倍,不足的进行字节填充,所以在原先13个字节的基础上填充3个字节。
编辑于 2022-03-20 17:21:21 回复(0)
结构体大小满足2^n 对齐原则 值得注意的是在32位机器上指针大小是4字节 64位机器是8字节 (有错误还请uu们指出)
发表于 2021-10-12 18:53:17 回复(0)