C语言再学习
C语言再学习
#incude <> / #include “”的区别
- 有三个路径需要区分:
- 系统库路径 -> 无需配置,这个路径已经硬写入了编译器的配置中
- 工程定义头文件搜索目录 -> 需要使用编译器提供的参数选项进行配置,例如
gcc -I <search_path> - 当前目录 -> 无需配置,但是只有使用
#include "xxx.h"格式的才会在当前路径下查找
- 前两种路径都可以使用
#inlcude <>进行包含
- 有三个路径需要区分:
数组与指针变量的区别
- char str[20]; char *ptr_s = “abcdefg”; -> 索引操作:str[5] 与 pstr_s[5]
- str[5],[汇编层面理解:str表示数组所在的地址],因此只需要将这个地址加上索引*size,再对新得到的地址进行取值操作即可
- pstr_s[5],[pstr_s是一个变量,要先取值得到地址值],之后的操作同上
- 作为函数形参:char *ptr 与 char ptr[]是一样的。这是由于出于性能的考虑,一般把数组传递给函数时,只会传递数组首元素的地址。因此,这两种形参,在函数内部都是得到一个指针。
gcc相关编译参数
- -L :链接时库搜索路径
- -R :运行时库搜索路径。这个信息会被写入到最终的可执行文件中,并被动态加载其解析使用
- -l : 指定需要参与链接的库
little trick -> 静态链接
- gcc -c main.c -lmath -o main -> 这里源文件出现在库之前
- gcc -lmath -c main.c -o main -> 库出现在main之前,此时还没有未定义的符号,因此不从库中提取任何符号;因此在链接时可能会报“符号未定义”的错误
局部变量及初始化
- 不会出现在最终的可执行文件中,运行时在栈上创建
- 有明确的代码进行栈空间的开辟,且初始值会作为指令的操作数出现在代码段中
常见错误:
- 总线错误:一般都是由于未对齐的读或写引起
- 段错误:通常是由于解引用一个未初始化或非法的地址值引起
C语言再学习
http://example.com/2024/07/10/C语言再学习/