news 2026/4/9 20:07:02

C语言——数据在内存中的存储

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言——数据在内存中的存储

C语言——数据在内存中的存储

在 C 语言中,理解“数据到底是怎么存在内存里的”是非常核心的一环。这直接影响到你对指针、内存对齐、字节序、大小端、结构体布局、联合体、位域等很多重要概念的理解。

下面从最基础开始,一步步把 C 语言中各种数据类型在内存中的真实存储方式讲清楚。

1. 内存的基本概念(先搞清楚这几点)

  • 内存是以**字节(byte)**为单位编址的
  • 每个字节有唯一的地址(通常用十六进制表示)
  • 现代计算机基本都是8 bit = 1 byte
  • 内存地址通常按从小到大增长(低地址 → 高地址)
  • 大多数系统采用小端序(little-endian),少数采用大端序(big-endian)

2. 基本数据类型在内存中的存储(以 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
long8(64位系统)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 位扩展精度)
指针(*)4(32位)/ 8(64位)4/8存储内存地址

3. 小端序 vs 大端序(最容易混淆的部分)

小端序(Little-Endian)低位字节存低地址(目前绝大多数 x86、x86_64、ARM 都是小端)

大端序(Big-Endian)高位字节存低地址(一些网络协议、PowerPC、SPARC 常用)

例子int x = 0x12345678;

在内存中的存储(假设地址从 0x1000 开始):

地址小端序(主流)大端序
0x10007812
0x10015634
0x10023456
0x10031278

怎么判断当前系统是小端还是大端?

#include<stdio.h>intis_little_endian(){intnum=1;return*(char*)&num==1;// 如果低地址存的是 01,则小端}intmain(){printf("是小端序吗? %s\n",is_little_endian()?"是":"否");return0;}

4. 结构体在内存中的存储(内存对齐)

C 语言为了提高 CPU 访问效率,会对结构体成员进行内存对齐(padding)。

规则(常见编译器默认):

  1. 结构体整体大小 = 最后一个成员偏移 + 最后一个成员大小 + 填充字节
  2. 每个成员的起始地址 = 该成员大小的倍数(或结构体最大成员大小的倍数)
  3. 结构体总大小必须是结构体最大成员大小的倍数(padding 到对齐边界)

示例

structA{chara;// 1 字节intb;// 4 字节shortc;// 2 字节};structB{chara;// 1shortc;// 2intb;// 4};

在 64 位系统 + 4 字节对齐下的布局:

  • struct A:1 + 3(填充) + 4 + 2 + 2(填充) =12 字节
  • struct B:1 + 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.i=0x12345678;printf("%x\n",d.c[0]);// 小端下可能是 78

6. 位域(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. 动手验证建议

写下面这段代码,打印每个成员的地址和内容,看看内存布局:

#include<stdio.h>structTest{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 浮点精确表示、位域跨字节、结构体在不同编译器下的布局差异、内存对齐对性能的影响等),随时告诉我,可以继续展开。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/18 12:45:18

Llama-3.2-3B效果实测:Ollama部署后的惊艳表现

Llama-3.2-3B效果实测&#xff1a;Ollama部署后的惊艳表现 1. 开篇&#xff1a;小身材大能量的语言模型 最近Meta发布的Llama-3.2-3B模型让我眼前一亮——这个只有30亿参数的小模型&#xff0c;在文本生成任务上的表现完全不输给一些大模型。通过Ollama部署后&#xff0c;我进…

作者头像 李华
网站建设 2026/4/8 18:56:54

零基础入门:用Qwen3-ASR-0.6B搭建本地语音识别工具

零基础入门&#xff1a;用Qwen3-ASR-0.6B搭建本地语音识别工具 1. 为什么你需要一个本地语音识别工具&#xff1f; 你是否遇到过这些场景&#xff1a; 开会录音后&#xff0c;手动整理会议纪要花了整整一小时&#xff1b;想把采访音频转成文字&#xff0c;却担心上传到云端泄…

作者头像 李华
网站建设 2026/4/1 7:38:43

Qwen3-ForcedAligner-0.6B部署指南:纯本地运行的语音识别解决方案

Qwen3-ForcedAligner-0.6B部署指南&#xff1a;纯本地运行的语音识别解决方案 1. 引言 你是否遇到过这些场景&#xff1f; 会议录音转文字耗时半小时&#xff0c;还要手动对齐时间戳&#xff1b;剪辑视频时反复拖动音频波形找说话起止点&#xff1b;为播客制作双语字幕&#…

作者头像 李华
网站建设 2026/4/3 4:37:41

Qwen3-ASR-0.6B入门:从安装到语音转写全流程

Qwen3-ASR-0.6B入门&#xff1a;从安装到语音转写全流程 这是一款真正能“装进笔记本电脑”的语音识别工具——不用联网、不传音频、不依赖云服务&#xff0c;点开浏览器就能把会议录音、课堂笔记、采访素材变成可编辑的文字。它不是概念演示&#xff0c;而是你明天就能用上的…

作者头像 李华
网站建设 2026/3/29 5:33:37

DeerFlow WebUI体验:可视化操作研究助手

DeerFlow WebUI体验&#xff1a;可视化操作研究助手 如果你正在寻找一个能帮你做深度研究、自动生成报告、甚至制作播客的AI助手&#xff0c;那么DeerFlow绝对值得你花时间了解一下。今天&#xff0c;我们不谈复杂的架构和代码&#xff0c;就从一个普通用户的角度&#xff0c;…

作者头像 李华
网站建设 2026/4/8 13:41:35

美胸-年美-造相Z-Turbo实用教程:打造个性化美胸角色

美胸-年美-造相Z-Turbo实用教程&#xff1a;打造个性化美胸角色 想不想亲手创造出专属于你的、独一无二的二次元美胸角色&#xff1f;无论是为你的故事寻找灵感&#xff0c;还是为你的游戏设计人物&#xff0c;又或者只是想体验一下AI绘画的乐趣&#xff0c;今天要介绍的这个工…

作者头像 李华