1、gcc编译器
GCC错误类型及对策
gcc -E a.c a.i;预处理
gcc -S a.i a.s;汇编文件
gcc -c a.s a.o;目标文件
gcc -o a.o a.exe;可执行程序
2、gdb 调试工具
l (L);查看代码,一次l一次10行输出,
b num(行号) ;设置断点,在指定行之前停止;info b (查看断点);
r;代码运行;
n;一步一步执行;
p 变量名;查看变量的值;
s;进入函数;
q;退出;
c;恢复执行,退出一行一行执行模式,一次执行完;
help;帮助命令;
3、条件编译和结构体
编译器根据条件的真假决定是否编译相关代码;
加了n就是如果没有宏定义debug就执行;
也可以把_debug_直接改成0或1;或者宏定义为0或1;
结构体:
struct a{}; //把这个当作数据类型来使用;
注意数组的使用必须一位一位操作;
结构体变量的赋值;
可以在定义变量时赋值;
也可以在定义结构体时赋值;
在函数内一个成员一个成员地赋值;
定义完结构体直接定义变量可以省略
定义完结构体再去定义变量地时候就不能省略;
结构体地大小;
64bit系统输出用%ld;sizeof中;
4、结构体数组和结构体指针
当结构体变量需求量大的时候用结构体数组;
赋值一
赋值二
赋值三
结构体指针
该指针存了结构体成员的地址;
也可以用p->num;来访问结构体指针的成员;
p指针没有初始化,是一个野指针,在内存中是一个随机的值,所以不能赋值,否则非法访问空间出现段错误;
5、共用体和typedef
*p ==q;
6、内存管理
动态内存
动态储存分配:有些对象只有在程序运行时才会分配内存
堆内存的分配与释放:*malloc(开辟size大小的空间并返回地址)/free;
free(p);//释放p中存的地址对应的空间;
不能重复释放;
根据malloc的返回值进行优化代码