UNIX is very simple, it just needs a genius to understand its simplicity.
指针的应用
1 | char *p; |
这是可以的,因为“test”已经分配了空间,所以指针指向了“test”内存空间的首地址
1 | char *p; |
这时候就会报错,因为并没有给p分配内存空间不可以把“test”复制到指针变量里
结构体指针的应用
首先结构体里存指针
1 | typedef struct test{ |
main中测试:
1 | pTest p = malloc(sizeof(test)); |
需要注意的是,如果单纯使用malloc
函数分配空间,分配的空间是结构体里指针的空间(指针64位,8byte),与指针代表的数据所占用空间无关
但在测试程序中,直接=“fff”是可以的,因为这时候就已经为字符串开辟好了栈空间,test1->test直接指向这个空间的首地址。
1 | typedef struct test{ |
如果是正常情况下
1 | test *b = malloc(sizeof(test)); |
- 指针是指针,如果想给指针赋值,必须要给指针分配对应的内存空间
函数操作结构体指针的指针
1 |
|
这是一段cJson解析json的代码,我需要这段代码填充LOGOUT_INFO这个对象,所以传入一个结构体指针,直接对内存空间进行操作,首先要先对logout_info->IP初始化,malloc函数为其分配空间,之后就可以使用strcpy进行copy。
C语言引入静态库
- 静态库:
- 链接时将程序放进进可执行程序
- 会产生多分副本
- 不依赖程序运行
- 动态库:
- 程序运行时,加载时才去动态库找函数
- 多进程共享
- 依赖程序运行
通常我们的做法是:
先对library.c与library.h进行编译gcc -c library.c
然后ar rcs libTest.a library.o ....
生成libTest.a文件,也就是静态库文件
然后使用这个库的方法:
在项目中编写一个lib_static.h文件,里面包含:extern void name(void);
在main函数中引入这个头文件,就可以拿到这些方法了
在编译项目时,需要把库文件指定给当前项目。
使用gcc编译的方法是:
-L指定搜索的路径,一般为项目的lib目录下,需要手动考入,
-l指定具体文件,这个文件可以是自己编译的也可以是三方提供gcc -L/home/user/xxx/lib main.c -llibTest.a -o app
但通常使用IDE时,使用cMake的方式编译,贴出CMakeList.txt的代码
1 | //设置最低版本 |