ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

【00010】

【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)小空间尽量使用栈区,大空间再使用堆区,如果必须要用堆区,将多个小的空间封
装成一个大空间(结构体),再一次性申请堆区空间

返回列表