欢迎光临
我们一直在努力

c语言学习笔记:内存管理与位运算

最近学到了内存管理和位运算这一块,内容不算多但挺重要的,整理一下重点。

 

一、内存管理

 

内存分布

 

程序运行时的内存大概分这么几块:

 

– 栈区:局部变量、函数形参、返回值、函数调用保护现场。系统自动管理,默认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效率高很多。

赞(0)
未经允许不得转载:171主机测评 » c语言学习笔记:内存管理与位运算
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址