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语言再学习/
作者
Cyokeo
发布于
2024年7月10日
许可协议