ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

嵌入式学习15

嵌入式学习15 标题C语言底层核心位运算详解 程序五大内存分区全梳理前言最近系统学习C语言底层知识点今天啃完两大重难点位运算和程序内存分区管理。位运算是嵌入式、驱动开发必备技能直接操作二进制比特位内存分区是理解程序运行、排查内存泄漏、段错误的根本。本文整理完整知识点、实操模板、踩坑易错点适合零基础巩固、面试复习。一、位运算直接操作二进制比特位1. 六种基础位运算符位运算仅支持整型数据char/short/int/long浮点数float、double无法参与运算。运算符运算规则典型场景 按位与对应bit全1才为1否则0指定位清零、提取特定位| 按位或对应bit有1则1全0才0将指定bit置1^ 按位异或对应bit相同为0不同为1翻转bit、交换两数无临时变量~ 按位取反所有bit 0↔1配合与运算清零特定位 左移整体左移N位低位补0快速乘以2的N次方 右移整体右移N位有符号补符号位快速除以2的N次方2. 工业级常用位操作模板1将数字第n位设置为1// n为目标bit下标从0开始计数num|(1n);2将数字第n位清零num~(1n);3异或交换两个整数无需临时变量voidswap(int*a,int*b){*a*a^*b;*b*a^*b;*a*a^*b;}3. 高频注意事项易错坑区分逻辑运算符与位运算符 ||是逻辑运算结果只有0/1 | ^是位运算操作二进制每一位完全不能混用。移位运算优先级低于加减1 3 1等价(13) 1 8不是1 (31)7复杂运算建议加括号。有符号数右移补符号位负数右移永远为负数无符号数字右移统一补0移位溢出会丢失数据避免超大移位。~取反容易踩坑~1结果不是0而是所有bit翻转的负数计算机用补码存储负数不能直接用~num判断正负。二、 C程序内存分区管理Linux环境1. 五大内存分区完整图解程序运行时内存从低地址到高地址分为文本段、数据区、栈区、堆区、CPU寄存器。.text 文本段只读存放所有函数代码、程序指令权限只读修改会直接段错误生命周期全程伴随程序。数据区编译阶段分配程序结束释放.data已初始化全局变量、static静态变量.bss未初始化全局/static变量程序加载时自动填充0.rodata字符串常量、const只读常量禁止写操作。栈区 stack操作系统自动管理存放局部变量、函数形参、函数返回地址进入函数分配函数执行完毕自动回收。坑局部变量不初始化值为随机脏数据栈空间很小禁止超大数组。堆区 heap程序员手动管理唯一自主控制生命周期的内存通过malloc/calloc/realloc申请free手动释放。忘记释放 → 内存泄漏程序长时间运行内存占用持续上涨重复free、free栈变量/全局变量 → 程序崩溃。寄存器 registerCPU高速存储单元register修饰的变量优先存入寄存器读写速度远超内存。2. 堆区动态内存核心API#includestdlib.h// 申请size字节堆内存返回void*未初始化void*malloc(size_tsize);// 申请count个size空间自动初始化为0void*calloc(size_tcount,size_tsize);// 扩容/缩容已有堆内存void*realloc(void*ptr,size_tnew_size);// 释放堆内存voidfree(void*ptr);规范写法free后手动置空杜绝野指针int*pmalloc(40);free(p);pNULL;// 释放后置空避免野指针3. 共用体union与大小端存储union特点所有成员共享同一块内存空间大小等于最大成员占用字节大小端模式小端PC、ARM主流低内存地址存放数据低位大端网络协议低内存地址存放数据高位可通过union快速判断当前设备存储模式。4. 内存模块易错点汇总函数绝对不能返回局部变量地址局部变量存栈函数结束栈销毁指针变为野指针hello字符串常量存.rodata只读段不能修改字符char *s abc; s[0]x;直接崩溃static修饰局部变量存储在数据区仅第一次调用函数初始化普通局部变量每次进函数重建栈空间有限大容量数组、缓冲区统一放堆堆内存只能free一次重复free、释放非malloc指针直接触发段错误数组越界读写会破坏相邻内存产生无规律随机bug极难调试。三、今日学习总结位运算偏向底层硬件开发熟记置1、清零、异或交换三大模板区分位运算与逻辑运算内存分区是C语言排错核心分清栈/堆/数据区存放数据类型牢记堆内存malloc/free配对使用高频踩坑野指针、内存泄漏、栈溢出、修改只读字符串、返回局部变量地址拓展方向后续结合指针、结构体、动态数组实战堆内存管理实现动态链表。
返回列表