file文件函数
file:
file的 fwrite函数:
(1) 调用格式:fwrite(buf, sizeof(buf), 1, fp);
成功写入返回值为1(即count)
(2)调用格式:fwrite(buf, 1, sizeof(buf), fp);
成功写入则返回实际写入的数据个数(单位为Byte)
所以可以用返回值与sizeof(buf)进行比较,来判断是否完成了全部写入。
宏定义
.h中一般放的是同名.c文件中定义的变量、数组、函数的声明,需要让.c外部使用的声明。
对于宏定义,在gdb调试中值一般不可见,在编译时加入-gdwarf-2 -g3参数,可使宏定义的值可查看。
gcc -g -gdwarf-2 -g3 test.c -o test 将宏定义加进去编译
gdb调试
学习gdb调试
起到一个监控的作用。
在程序执行过程中,可以改变某个变量的值,以及代码执行顺序,从而修改逻辑错误。
基本的gdb参数
-g : 使用这个参数编译可执行文件,得到调试表 gdb ./temp list : list 1(选定的中心行) b : b 20 (选定的断点,还没执行这一行程序就暂停) run/r : 执行程序 n/next : 下一条指令(会越过函数) s/step : 下一条指令(会进入函数) p/print : p i (查看变量i的值) continue : 继续执行断点后续指令 quit : 退出gdb当前调试
ctrl + x + a 快捷键可以浏览当前所在代码上下几行。
在gdb运行中,可以使用set将变量的值进行修改,可以查看自己期待得到的结果。
查看内存地址指向的内容
同时,得到一个地址时,使用 x/20 + 地址 命令可以查看当前地址存放的20个字节存放的内容。
跳过当前函数
对于想跳过的函数可以使用finish命令。
跳过当前循环
对于想跳过的循环可以使用until命令。
保存gdb输出信息到日志
在实际工作中,常常会使用gdb命令,有时为了后续查看方便,可以将gdb的输出信息打印到特定文件中。
具体操作如下:
(gdb) set logging file fileName 设置文件名,文件默认生成在运行gdb命令的目录下;
(gdb) set logging on 启动日志记录;
(gdb) set height 0 这样gdb需要多行输出时,就会全部输出,中间不会暂停;
(gdb) set print elements 0 这样gdb在打印时就没有默认为200个元素的长度限制;
(gdb) thread apply all bt 在这里去实际操作,所需要的gdb命令
(gdb) set logging off
字符串函数
strstr()函数用于找到子串在一个字符串中第一次出现的位置,在string.h头文件中。
sprintf 跟 printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。
共同体
union 共用体名{ 成员列表 };
结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。