wordpress 年份索引,关键词搜索排名优化,seo公司是怎么做的,o2o网站建设计划书C语言——数据在内存中的存储 在 C 语言中#xff0c;理解“数据到底是怎么存在内存里的”是非常核心的一环。这直接影响到你对指针、内存对齐、字节序、大小端、结构体布局、联合体、位域等很多重要概念的理解。 下面从最基础开始#xff0c;一步步把 C 语言中各种数据类型…C语言——数据在内存中的存储在 C 语言中理解“数据到底是怎么存在内存里的”是非常核心的一环。这直接影响到你对指针、内存对齐、字节序、大小端、结构体布局、联合体、位域等很多重要概念的理解。下面从最基础开始一步步把 C 语言中各种数据类型在内存中的真实存储方式讲清楚。1. 内存的基本概念先搞清楚这几点内存是以**字节byte**为单位编址的每个字节有唯一的地址通常用十六进制表示现代计算机基本都是8 bit 1 byte内存地址通常按从小到大增长低地址 → 高地址大多数系统采用小端序little-endian少数采用大端序big-endian2. 基本数据类型在内存中的存储以 64 位系统为例类型常见大小字节对齐要求典型取值范围有符号内存表示特点char / signed char11-128 ~ 127直接存 ASCII 或数值unsigned char110 ~ 255—short22-32768 ~ 32767按小端/大端存 2 字节unsigned short220 ~ 65535—int44-2^31 ~ 2^31-14 字节整数unsigned int440 ~ 2^32-1—long864位系统8-2^63 ~ 2^63-1视平台32位系统可能是 4 字节long long88-2^63 ~ 2^63-1固定 8 字节float44≈ ±1.18e-38 ~ ±3.4e38IEEE 754 单精度浮点double88≈ ±2.23e-308 ~ ±1.79e308IEEE 754 双精度浮点long double12/16视平台8/16更高精度视编译器与平台x86 常用 80 位扩展精度指针*432位/ 864位4/8—存储内存地址3. 小端序 vs 大端序最容易混淆的部分小端序Little-Endian低位字节存低地址目前绝大多数 x86、x86_64、ARM 都是小端大端序Big-Endian高位字节存低地址一些网络协议、PowerPC、SPARC 常用例子int x 0x12345678;在内存中的存储假设地址从 0x1000 开始地址小端序主流大端序0x100078120x100156340x100234560x10031278怎么判断当前系统是小端还是大端#includestdio.hintis_little_endian(){intnum1;return*(char*)num1;// 如果低地址存的是 01则小端}intmain(){printf(是小端序吗 %s\n,is_little_endian()?是:否);return0;}4. 结构体在内存中的存储内存对齐C 语言为了提高 CPU 访问效率会对结构体成员进行内存对齐padding。规则常见编译器默认结构体整体大小 最后一个成员偏移 最后一个成员大小 填充字节每个成员的起始地址 该成员大小的倍数或结构体最大成员大小的倍数结构体总大小必须是结构体最大成员大小的倍数padding 到对齐边界示例structA{chara;// 1 字节intb;// 4 字节shortc;// 2 字节};structB{chara;// 1shortc;// 2intb;// 4};在 64 位系统 4 字节对齐下的布局struct A1 3(填充) 4 2 2(填充) 12 字节struct B1 1(填充) 2 4 8 字节如何关闭/控制对齐#pragmapack(1)// 1 字节对齐无填充#pragmapack()// 恢复默认__attribute__((packed))// gcc/clang 方式5. 共用体union在内存中的存储共用体所有成员共享同一块内存大小等于最大成员的大小。unionData{inti;// 4 字节floatf;// 4 字节charc[8];// 8 字节};unionData d;d.i0x12345678;printf(%x\n,d.c[0]);// 小端下可能是 786. 位域Bit-field的内存布局structFlags{unsignedintf1:1;unsignedintf2:3;unsignedintf3:4;intf4:8;};位域会尽量打包到同一个整数中但可能产生填充跨越不同整数时容易出错地址不可取 操作符对位域无效7. 快速记忆总结char → 1 字节原样存short/int/float → 2/4 字节按小端存主流double/long long → 8 字节结构体 →有对齐填充成员按声明顺序排列共用体 → 所有成员重叠大小取最大指针 → 存地址32位4字节64位8字节内存对齐 → 为了 CPU 访问效率宁可浪费空间8. 动手验证建议写下面这段代码打印每个成员的地址和内容看看内存布局#includestdio.hstructTest{chara;intb;shortc;doubled;chare;};intmain(){structTestt{A,0x12345678,0xABCD,3.1415926535,Z};printf(地址\t\t成员\t值\t\t十六进制\n);printf(%p\t a\t%c\t\t%x\n,t.a,t.a,t.a);printf(%p\t b\t%d\t\t%x\n,t.b,t.b,t.b);printf(%p\t c\t%d\t\t%x\n,t.c,t.c,t.c);printf(%p\t d\t%.3f\t\t%llx\n,t.d,t.d,*(unsignedlonglong*)t.d);printf(%p\t e\t%c\t\t%x\n,t.e,t.e,t.e);printf(\n结构体总大小%zu 字节\n,sizeof(t));return0;}运行后观察地址差值就能直观看到填充字节和对齐。如果你想深入某个部分比如 IEEE 754 浮点精确表示、位域跨字节、结构体在不同编译器下的布局差异、内存对齐对性能的影响等随时告诉我可以继续展开。