计算机中的内存存放变量时往往并不是按照一个接一个存的,为了存取的效率要字节对齐,基本数据类型以本类型的sizeof()值为对齐值,结构体则按照其成员对齐值最大的那个对齐,所谓有效对齐值N也即该数据在内存的 “存放其实地址%N=0”,结构体变量的成员按定义的先后顺序存放的,第一个成员的起始地址就是该结构体的变量的起始地址;

例如:

struct A

{

int a;

char c;

short s;

}x;

x占用8个字节,其成员a的有效对齐值4为最大,所以的有效对齐值为4,假设起始地址0x12ff0(0x12ff0%4=0),成员c对齐值是1,(下一个地址0x12ff4%1=0)接着存放,接着的一个地址0x12ff5%2!=0,2是s的有效对齐值,跳过一个字节,0x12ff6%2=0,s地址0x12ff6.

可以使用#pragma pack(n) 其中n是对齐值可取1、2、4、8....

如下例子

#include<stdio.h>
//#pragma pack(1)int main()
{struct sample{short int n;char c[8];float f;}s;printf("n成员:%d\n",sizeof(s.n));printf("c成员:%d\n",sizeof(s.c));printf("f成员:%d\n",sizeof(s.f));printf("总空间数:%d\n",sizeof(s));
}
注释掉#pragma pack(1)运行

2

8

4

16

不注释

2

8

4

14

结构体变量的内存分配相关推荐

  1. 【C语言】结构体类型和结构体变量(字节对齐)

    目录 一.结构体类型定义 二.结构体变量的定义 ①先定义结构体类型,再定义结构体变量 ②在定义结构体类型的同时,定义结构体变量 ③直接定义结构体变量 三.结构体变量的内存分配 四.结构体变量的初始化 ...

  2. go中结构体和结构体变量

    一 结构体和结构体变量的区别和联系 1 结构体是自定义的数据类型,代表一类事物. 2 结构体变量(实例)是具体的,实际的,代表一个具体变量. 二 结构体变量在内存的布局 三 如何声明结构体 1 基本语 ...

  3. C语言定义了一个结构体怎么分配内存?C\C++中结构体变量与结构体指针内存分配问题?

    C语言定义了一个结构体怎么分配内存?C\C++中结构体变量与结构体指针内存分配问题? 问题1:结构体指针最开始怎么分配内存?用sizeof()是不能确定大小的. 问题2:给结构体变量分配之后,是否还要 ...

  4. 【C 语言】结构体 ( 结构体类型定义 | 结构体类型别名 | 声明结构体变量的三种方法 | 栈内存中声明结构体变量 | 定义隐式结构体时声明变量 | 定义普通结构体时声明变量 )

    文章目录 一.结构体类型定义 二.结构体类型别名 三.结构体类型变量声明 1.使用结构体类型 ( 别名 ) 声明变量 2. 定义隐式结构体时声明变量 3.定义普通结构体时声明变量 二.完整代码示例 一 ...

  5. c语言中定义结构体指针并指向一片内存空间和直接定义一个结构体变量的区别 Node *p=(Node *)malloc(sizeof(Node)); 和 Node p 两个有什么区别??? Node是一

    (来自百度解答) Node *p是定义一个Node结构体指针,指针名为p,指向一个Node结构体,并为这个结构体分配了内存空间 该结构体无命名 Node p是定义一个Node结构体,结构体名为p. 追 ...

  6. 【C 语言】结构体 ( 结构体变量内存操作 | 通过 “ . “ 操作符操作结构体内存空间 | 通过 “ -> “ 操作符操作结构体内存空间 )

    文章目录 一.通过 " . " 操作符操作结构体内存空间 二.通过 " -> " 操作符操作结构体内存空间 三.代码示例 一.通过 " . &q ...

  7. C++_类和结构体所占内存大小,静态成员问题

    C++_类和结构体所占内存大小,静态成员问题 静态成员未初始化或者未调用(当然静态成员必须类外初始化才能调用)是不占内存的.静态成员不占类或结构体的内存 静态成员函数同样只声明未定义同样不占内存 指针 ...

  8. c malloc结构体_9.8 C++动态分配 | 存放结构体变量

    C++动态分配 C语言是利用库函数malloc和free来分配和撤销内存空间的:C++同样提供了较简便而功能较强的运算符new和delete来取代malloc和free函数. 在C++中,new和de ...

  9. C/C++ 结构体成员在内存中的对齐规则(转载)

    这几天在看王艳平的<windows 程序设计>,第5章讲解了MFC框架是怎么管理窗口句柄到窗口实例之间的映射,用到了两个类CPlex和CMapPtrToPtr,用于管理内存分配的类(避免因 ...

最新文章

  1. UOJ228:基础数据结构练习题——题解
  2. jAVA 得到Map价值
  3. mysql写法_MySQL基本语句写法
  4. hust 1605 bfs
  5. HDU_1874 畅通工程续(SPFA)
  6. 一文搞定Qt读写excel以及qt读写xml数据
  7. WPF实现用户头像裁剪
  8. MySQL忽略主键冲突,避免重复插入数据的三种方式
  9. python全排列速度最快_python 写的两种打印全排列的方法速度对比
  10. ECMAScript 6 之 let 和 const 命令
  11. mac mysql 中文_mac 中 mysql 中文乱码问题
  12. (六)、Redis的AOF持久化---Redis设计与实现读书笔记
  13. 画三线格子的高效方法,不用再一个格子一个格子的选中啦
  14. 联想Y7000P 安装黑苹果到外置移动机械硬盘
  15. 碧桂园博智林机器人总部大楼_碧桂园11.4亿元竞得北滘坤洲地块,近博智林机器人谷...
  16. 关于神经网络和深度学习的资料
  17. 洛谷P3354 [IOI2005]Riv 河流 题解
  18. 图形_反走样技术总结
  19. RGB颜色值与十六进制颜色码
  20. 在 Win7 下安装 KB4512506 补丁报告 0x80092004 错误的解决办法

热门文章

  1. win7 怎样找到 显示桌面
  2. Python中文文档 目录(转载)
  3. 用Scrapy抓取Yahoo! WOEID
  4. WannaCry席卷全球 软件作者到底赚了多少钱?
  5. c语言出圈问题10人,第38套题:c语言出圈问题分析.doc
  6. 华为荣耀小K2拆机参考
  7. 华为十年技术总监教你如何学好Jmeter接口测试+压力测试!!!
  8. Spring Boot集成支付宝(最新版SDK)—— 手机支付
  9. MFC绘制双有理Bezier曲面
  10. 计算机软件由程序数据和文档组成其中主体是,chap03 计算机软件