最近学到了内存管理和位运算这一块,内容不算多但挺重要的,整理一下重点。
一、内存管理
内存分布
程序运行时的内存大概分这么几块:
– 栈区:局部变量、函数形参、返回值、函数调用保护现场。系统自动管理,默认8M,访问效率高但空间小。
– 堆区:手动申请和释放,空间大但效率相对低。用malloc申请,free释放,忘了释放就内存泄漏了。
– 数据区:.data段放已初始化的全局变量和静态变量;.bss段放未初始化的,默认清0。
– 字符串常量区:"hello world"这种就存在这里。
– 文本区:放代码指令。
堆区操作
主要用这几个函数:
– malloc(size) :申请size字节的堆空间,成功返回首地址,失败返回NULL。
– free(ptr) :释放申请的堆空间。
– calloc(nmemb, size) :申请数组空间并清0。
基本套路就是申请完先判断是不是NULL,用完及时free。
int *p = malloc(4);
if (NULL == p) {
printf("malloc error\\n");
return 0;
}
*p = 10;
free(p);
二、位运算
位运算直接操作二进制位,效率很高。
六种位运算符
运算符 含义 规则
& 按位与 全1为1,有0则0
| 按位或 有1则1,全0为0
^ 按位异或 相同为0,相异为1
~ 按位取反 1变0,0变1
<< 左移 低位补0,相当于乘2^n
>> 右移 有符号数补符号位,无符号补0,相当于除2^n
常用技巧
1. 指定位置1
num = num | 1 << n;
2. 指定位清0
num = num & ~(1 << n);
3. 两数交换(不用中间变量)
a = a ^ b;
b = a ^ b;
a = a ^ b;
原理就是 a ^ a = 0 , a ^ 0 = a 。
优先级记住:单目 > 移位 > & > ^ > |
三、程序调试方法
打印调试
最直接的,printf输出变量值看对不对。
gdb调试
Linux下用的调试工具,能打断点、单步执行、查看变量。
常用指令:
– b 行号 :打断点
– r :运行程序
– n :执行下一行
– p 变量名 :查看变量值
– s :跟进函数
– q :退出
编译的时候要加 -g 选项才能用gdb调试。段错误用 r where 能定位位置。
这部分核心就是理解内存分布、会用malloc/free,以及位运算的几个常用操作。gdb调试用熟了找bug效率高很多。




