
一、操作系统程序内存分区详解程序编译生成可执行文件a.out存入硬盘运行时系统会把程序加载进内存内存会被划分为 5 大区域内核区、栈区、堆区、数据区、文本区代码段。1. 各区域作用与特性1内核区操作系统独占空间用户代码无权限读写用来管理硬件、进程调度我们开发完全不用操作。2栈区Stack存储内容局部变量、函数形参、函数调用现场、临时表达式管理方式系统自动分配释放函数执行完毕栈帧直接销毁限制默认大小 8M空间很小不能定义超大数组特点读写速度极快连续空间坑点超大局部数组会直接栈溢出报段错误3堆区Heap存储内容开发者手动申请的动态内存管理方式人工管理malloc/calloc申请free释放特点空间大无固定上限读写速度慢于栈核心注意申请内存后不释放会造成内存泄漏释放后继续使用产生野指针4数据区细分 3 个子段.data段已初始化全局变量、static 静态变量程序启动分配程序结束回收.bss段未初始化全局 / 静态变量系统自动初始化为 0字符串常量区存放hello这类双引号字符串只读修改会触发段错误5文本区代码段存放编译后的二进制指令、常量代码只读防止程序运行时篡改指令。2. 堆与栈核心对比表对比维度栈区 Stack堆区 Heap管理者操作系统自动管理程序员手动 malloc/free空间大小默认 8M容量小虚拟内存上限空间极大生命周期函数结束自动销毁直到 free / 程序结束才释放访问效率高CPU 缓存友好低需要内存寻址使用场景临时局部数据、小变量超大数组、函数外长期存在的数据二、动态内存管理堆区操作 APIC 标准库stdlib.h提供 4 个堆内存操作函数核心三剑客malloc、calloc、free还有扩容函数realloc。1. malloc申请指定字节堆内存void *malloc(size_t size);参数size需要申请的总字节数返回值成功返回堆空间首地址失败返回NULL内存不足特点申请的内存不会自动清零内部是随机脏数据示例申请 int 数组空间#include stdio.h #include stdlib.h int main() { int arr_len 10; // 申请10个int大小的堆内存 int *p malloc(arr_len * sizeof(int)); if (NULL p) // 必须判空防止分配失败 { perror(malloc fail); return -1; } // 使用内存 for(int i 0; i arr_len; i) p[i] i; // 使用完释放 free(p); p NULL; // 置空避免野指针 return 0 }2. calloc批量申请并自动清零void *calloc(size_t nmemb, size_t size);参数nmemb元素个数size单个元素字节特点分配完成后内存全部置 0适合数组初始化// 申请5个char空间全部初始化为0 char *str calloc(5, sizeof(char)); free(str);3. free释放堆内存void free(void *ptr);只能释放malloc/calloc/realloc开辟的堆地址不能释放栈 / 全局变量地址同一块内存不能重复 free会触发程序崩溃释放后建议指针赋值NULL杜绝野指针4. realloc堆内存扩容 / 缩容void *realloc(void *ptr, size_t new_size);作用修改已有堆内存大小原有数据保留注意扩容可能开辟新内存原地址失效必须接收新返回值5. 常见内存错误避坑内存泄漏malloc 后忘记 free长期运行程序占用内存持续上涨野指针free 后不置空继续使用指针访问内存越界访问操作超过申请字节范围的堆内存破坏其他程序数据重复释放一块内存多次 free程序直接异常退出三、位运算底层二进制操作神器位运算直接操作数据二进制 bit 位运行效率远高于四则运算广泛用于硬件寄存器、权限掩码、数值加密、高效乘除。 C 语言提供 6 个位运算符操作对象只能是整型char/short/int/long浮点 float/double 不支持。1. 6 大位运算符规则总览运算符名称运算规则按位与对应 bit 全 1 结果为 1有 0 则 0按位或对应 bit 有 1 结果为 1全 0 才 0^按位异或对应 bit 相同为 0不同为 1~按位取反0 变 11 变 0单目运算符左移整体左移 N 位低位补 0等价 ×2ⁿ右移整体右移 N 位有符号高位补符号位无符号补 0等价 ÷2ⁿ2. 逐运算符实战举例以 int 900001001、600000110 为例1按位与 9 : 0000 1001 6 : 0000 0110 96: 0000 0000 0经典用途清零指定 bit、判断奇偶// 判断数字是否偶数 最低位为0就是偶数 if((num 1) 0) printf(偶数); // 将第3位清0 num num ~(1 3);2按位或 |9 : 0000 1001 6 : 0000 0110 9|6: 0000 1111 15经典用途将指定 bit 置 1// 把数字第3位设置为1 num num | (1 3);3按位异或 ^9 : 0000 1001 6 : 0000 0110 9^6: 0000 1111 15两大黑科技用法不借助中间变量交换两个整数int a 3, b 5; a a ^ b; b a ^ b; a a ^ b;翻转指定 bit 位4按位取反单目运算符所有 bit 反转有符号数会变成负数补码存储~9 ~00001001 111101105左移 快速乘法num n num × 2ⁿ低位补 0int a 9; int res a 3; // 9 * 8 726右移 快速除法num n num / 2ⁿ向下取整int a 9; int res a 3; // 9 / 8 13. 位运算高频工业场景硬件寄存器配置单片机、驱动开发用掩码单独控制某一个引脚电平权限标记存储用一个 int 存储多种权限读 / 写 / 执行分别占 1bit高效数值运算代替乘除 2 的幂次运算减少 CPU 计算周期数据加密校验异或加密、简单哈希校验大小端判断配合共用体判断 CPU 存储字节序四、拓展补充大小端与共用体结合位运算CPU 分为小端、大端存储模式小端低字节存内存低地址x86 电脑通用大端高字节存内存低地址网络传输、部分嵌入式芯片共用体 位运算检测大小端代码#include stdio.h union EndianTest { int a; char b; }; int main() { union EndianTest tmp; tmp.a 1; if(tmp.b 1) printf(小端模式\n); else printf(大端模式\n); return 0; }五、总结内存管理核心栈自动释放堆手动 malloc/free全局 / 静态变量存数据区生命周期等于程序运行时长动态内存必须判空、用完释放、指针置空杜绝内存泄漏与野指针位运算核心|置 1、清 0、^翻转 / 交换、移位替代乘除 2 的幂只支持整型底层硬件开发、性能优化必备工具