UNIX is very simple, it just needs a genius to understand its simplicity.

-土杜土杜

指针的应用

1
2
char *p;
p = "test";

这是可以的,因为“test”已经分配了空间,所以指针指向了“test”内存空间的首地址

1
2
char *p;
strcpy(p,"test");

这时候就会报错,因为并没有给p分配内存空间不可以把“test”复制到指针变量里

结构体指针的应用

首先结构体里存指针

1
2
3
typedef struct test{
char *test;
}test,*pTest;

main中测试:

1
2
3
pTest p = malloc(sizeof(test));
p->test = "test String";
printf("%s\n",p->test);

需要注意的是,如果单纯使用malloc函数分配空间,分配的空间是结构体里指针的空间(指针64位,8byte),与指针代表的数据所占用空间无关

但在测试程序中,直接=“fff”是可以的,因为这时候就已经为字符串开辟好了栈空间,test1->test直接指向这个空间的首地址。

1
2
3
typedef struct test{
long *a;
}test;

如果是正常情况下

1
2
3
4
5
6
test *b = malloc(sizeof(test));
long x = 10;
//b中指针指向x的内存地址
b->a = &x;
//取值需要用
long value = *(b->a);
  • 指针是指针,如果想给指针赋值,必须要给指针分配对应的内存空间

函数操作结构体指针的指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

//样例代码
typedef struct {
char *IP;
}LOGOUT_INFO;

void send_client_logout_info(LOGOUT_INFO *logout_info,char *json) {
cJSON *item;
cJSON *root = cJSON_Parse(json);

logout_info->IP = malloc(16);

item=cJSON_GetObjectItem(root,"IP");
strcpy(logout_info->IP,item->valuestring);

if (root)
cJSON_Delete(root);
}

这是一段cJson解析json的代码,我需要这段代码填充LOGOUT_INFO这个对象,所以传入一个结构体指针,直接对内存空间进行操作,首先要先对logout_info->IP初始化,malloc函数为其分配空间,之后就可以使用strcpy进行copy。

C语言引入静态库

  • 静态库:
  1. 链接时将程序放进进可执行程序
  2. 会产生多分副本
  3. 不依赖程序运行
  • 动态库:
  1. 程序运行时,加载时才去动态库找函数
  2. 多进程共享
  3. 依赖程序运行

通常我们的做法是:
先对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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//设置最低版本
cmake_minimum_required(VERSION 3.8)
//项目名称
project(webTest)

//编译版本
set(CMAKE_C_STANDARD 99)

//包含的目录
include_directories(lib/)
//相当于-L
link_directories(lib/)
//相当于-l
link_libraries(libIMprotocol.a)

//设置编译的源文件
set(SOURCE_FILES main.c
SETCONFIG/CONNECTIONSET.h
FUNCTION/Connection.c FUNCTION/Connection.h FUNCTION/InitConnection.c FUNCTION/InitConnection.h
TOOL/GETConfig.c
lib/static_lib.h)

add_executable(webTest ${SOURCE_FILES})
//防止linux下线程方法不可用,应该是某种机制
target_link_libraries(webTest pthread)