结构体内存对齐经典题

简介: 如果对结构体内存对齐还不是很理解的话,做题之前可以看一看喔,看完轻轻松松就可以做出了啦。如果懂的话,请做题吧!

本篇收录三道有关内存对齐的经典练习题,可供初学者练习刷题,如果想知道更多的内存对齐相关知识可以进入该作者的《结构体内存对齐与位段》了解


《结构体内存对齐与位段》


如果对结构体内存对齐还不是很理解的话,做题之前可以看一看喔,看完轻轻松松就可以做出了啦。如果懂的话,请做题吧!


第一题:


在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是(


struct A
{
 int a;
 short b;
 int c;
 char d;
};
struct B
{
 int a;
 short b;
 char c;
 int d;
};
int main()
{
  printf("%d\n", sizeof(struct A));
  printf("%d\n", sizeof(struct B));
  return 0;
}


A.16,16

B.13,12

C.16,12

D.11,16


结果:


f2dc5f71ccdf40a1b9b06fb82f09d095.png


ba4ac7d997404254b3eb296dfc297599.png


416c4561778d4658804b93a144fd6f2c.png


第二题


下面代码的结果是:(


#pragma pack(4)/*编译选项,表示4字节对齐 平台:VS2013。语言:C语言*/
int main(int argc, char* argv[])
{
  struct tagTest1
  {
    short a;
    char d; 
    long b;   
    long c;   
  };
  struct tagTest2
  {
    long b;   
    short c;
    char d;
    long a;   
  };
  struct tagTest3
  {
    short c;
    long b;
    char d;   
    long a;   
  };
  struct tagTest1 stT1;
  struct tagTest2 stT2;
  struct tagTest3 stT3;
  printf("%d %d %d", sizeof(stT1), sizeof(stT2), sizeof(stT3));
  return 0;
}
#pragma pack()


A.12 12 16

B.11 11 11

C.12 11 16

D.11 11 16


结果:


0a3f0170c7d14a489e8aa102b81ab7a9.png


解析:


0553394f19c64cedaa49f28940eb6802.png

2d61516efcc24895a3bd21746d160992.png


22bd286b606841b1812fa6000d76cef6.png


第三题:


在VS2013下,默认对齐数为8字节,这个结构体所占的空间大小是( )字节


typedef struct{
  int a;
  char b;
  short c;
  short d;
}AA_t;


A.16

B.9

C.12

D.8


结果:


02407bf36d6441f4b6a8f5338e1beacf.png


解析:


7a94a8df81f34403be510abe838a4e59.png

相关文章
|
存储 安全 编译器
【Qt 底层机制之信号和槽 】深入探究Qt信号和槽背后的原理
【Qt 底层机制之信号和槽 】深入探究Qt信号和槽背后的原理
3823 4
|
6月前
|
人工智能 自然语言处理 开发者
Qoder 降价,立即生效!首购 2 美金/月
Qoder全球上线两月获数十万开发者信赖!现首购仅2美元/月,享全功能AI编程利器。集成顶尖模型,支持10万文件检索、智能体异步执行、CLI终端交互,助力高效开发。
1627 8
|
安全 C++
【C++11保姆级教程】移动构造函数(move constructor)和移动赋值操作符(move assignment operator)
【C++11保姆级教程】移动构造函数(move constructor)和移动赋值操作符(move assignment operator)
1957 0
|
存储 安全 测试技术
数组越界:深入理解、危害与防范
数组越界:深入理解、危害与防范
3590 18
|
8月前
|
缓存 网络架构
详细解释udp的传输过程(含多图)
本文详解UDP数据包的传输过程,涵盖跨交换机与路由器的完整流程。分析10KB UDP包的分片机制,需拆分为7个IP数据报传输。交换机和中间路由器不会等待完整数据接收,而是逐帧/分片转发,且每个IP分片均包含完整IP地址信息。
|
存储 缓存 C语言
【C/C++ 库的动态链接】深入理解动态链接器:RPATH, RUNPATH与$ORIGIN
【C/C++ 库的动态链接】深入理解动态链接器:RPATH, RUNPATH与$ORIGIN
1284 0
|
算法 程序员 C++
程序员必知:单链表排序(快速排序、归并排序)
程序员必知:单链表排序(快速排序、归并排序)
450 0
|
传感器 算法 Ubuntu
大疆M2006电机测试文档
本文是关于大疆RoboMaster M2006电机的测试文档,介绍了在Ubuntu20.04环境下通过ROS读取电机反馈信息、控制电机移动,并利用PID控制算法实现速度闭环的测试流程,涵盖了测试材料、接线方法、电机校准、CAN通讯测试以及在ROS中的移植和PID调节的详细步骤和方法。
1715 0
大疆M2006电机测试文档
多线程线程安全问题之什么是锁的粒度,减少锁的粒度有哪些好处
多线程线程安全问题之什么是锁的粒度,减少锁的粒度有哪些好处
|
Linux iOS开发 MacOS
如何查看你的Python版本?
在命令行中查看Python版本很简单。在Windows上按Win+R,输入powershell;在macOS上通过Finder→Applications→Utilities→Terminal;在Linux上打开终端。然后输入`python --version`或`python -V`。输出显示如"Python 3.8.3"。使用`python -VV`可获取更多详细信息。在Python脚本中,可通过`sys.version`或`platform.python_version()`检查版本。确保使用Python 3,因为Python 2自2020年起已停止更新和支持。
3343 5