void*类型强制转换结构体指针类型
今天遇见一个自己之前不理解的地方,记录一下,教训
在使用sqlite3的时候,里面有一个回调函数,但是获取数据之后我想要把我获取的数据拿出来,找不到其他的办法。callback函数中的第一个参数就是传参的,这也是我能够想到的唯一切口了。
static int callback(void *data, int argc, char **argv, char **azColName)
但是他是void类型的,传进来结构体的地址之后,就需要注意了,需要强制类型转换,但是又不能直接转换,需要重新定义一个结构体指针,再进行强制类型转换。
还需要注意的就是结构体里面的变量不能赋初始值,默认为0。
源代码如下,大家可以去调试试试看,主要看代码:14.15.16行理解就可。
1 #include <stdio.h>
2 #include <sqlite3.h>
3 #include <time.h>
4 #include <string.h>
5 #include <errno.h>
6
7 typedef struct
8 {
9 int i;
10 } Time;
11
12 int callback(void *data, int argc, char **argv, char **azColName)
13 {
14 Time *sq_data;
15 sq_data = (Time*)data;
16 sq_data -> i = 2;
17 printf("In the callback function:i = %d\n", sq_data -> i);
18 return 0;
19 }
20 int main(int argc, char argv[])
21 {
22 sqlite3 *db = 0;
23 sqlite3_open("temper.db", &db);
24 Time t_tmp;
25 printf("Before enter the function:i = %d\n", t_tmp.i);
26 int rc = -1;
27 char *sql_select;
28 sql_select = "select *from temper limit 1";//获取第一条数据
29 rc = sqlite3_exec(db, sql_select, callback, &t_tmp, NULL);
30 if(rc != SQLITE_OK)
31 {
32 printf("sql_select_first failure.%s\n", strerror(errno));
33 }
34 printf("After enter the function:i = %d\n", t_tmp.i);
35 return 0;
36 }
这样里面的函数将信息传进结构体,外面的函数也可以调用啦!
如果有更好的方法感谢提出~