【00010】
二、C语言
2.9位运算
1. 运算符
算数运算符
关系运算符
逻辑运算符
赋值运算符
特殊运算符
逗号运算符
sizeof运算符
2. 位运算符
& 按位与
| 按位或
^ 按位异或
~ 按位取反
<< 左移
>> 右移
与0得0,或1置1
3. 位运算常见操作
(1)将变量第n位置1
num |= (1 << n);
(2)将变量第n位置0
num &= ~(1 << n);
(3)异或可以实现两个变量数值的交换
a = a ^ b;
b = a ^ b;
a = a ^ b;
2.10 内存管理
1.C语言内存分布
2. 堆区
通过malloc申请堆区空间
通过free释放堆区空间
注意:
如果malloc的空间使用完毕没有及时free释放,会产生内存泄露
使用场景:
函数体内的局部数据不想随函数结束被回收,可以放入堆区空间
存放比较大的数据(MB),存放到堆区空间
3. 程序错误调试方法
(1)语法错误
Warnning:告警,程序编译成功,但存在告警,可能运行时会产生问题
error:错误,程序编译失败,找到出错的问题修改代码
(2)逻辑错误
打印方法调试:在可能出现逻辑错误的位置加入printf打印,运行时查看打印结果与设想
结果是否一致,从而定位出错的位置
GDB调试方法
1. 编译代码时加入-g选项,允许进行gdb调试
gcc filename.c -g
2. 使用gdb调试代码
gdb a.out
3. 输入命令调试代码
l 查看代码
b 行号/函数名 在行号/函数名对应的位置设置断点
r 运行代码
n 单步执行
s 进入函数体内部运行
p 变量名 查看变量的值
c 继续运行程序到下一处断点
(3)段错误
1.打印方法
程序代码中多加入一些打印,前一句能够打印出来,后一句打印部出来,两句代码中间
就产生段错误
2.通过gdb定位段错误
分布调试,查看代码是否产生段错误
3.允许程序段错误时产生core文件,core文件中包含段错误产生时的堆栈调用关系,根据
这个core文件搭配gdb快速找到段错误出现的位置
(1)编译代码时加入-g选项
gcc filename.c -g
(2)允许代码段错误时产生core文件
ulimit -c unlimited
(3)运行代码产生段错误,并生成core文件
(4)使用gdb调试core文件,快速定位到程序产生段错误的位置
gdb a.out core
4.内存越界、内存溢出
使用strncpy、strncat、strncmp替代strcpy、strcat、strcmp
5.内存泄露
1. 申请的堆区空间没有释放会产生内存泄露
2. 使用valgrind工具查看内存是否泄露
valgrind --tool=memcheck --leak-check=full ./a.out
6.内存碎片
(1)由于堆区空间存在一些占用的小的空间,导致大空间不连续,无法被申请使用,该
现象称为内存碎片
(2)malloc不要申请小空间
(3)小空间尽量使用栈区,大空间再使用堆区,如果必须要用堆区,将多个小的空间封
装成一个大空间(结构体),再一次性申请堆区空间
