void*类型强制转换结构体指针类型

void*类型强制转换结构体指针类型

今天遇见一个自己之前不理解的地方,记录一下,教训

在使用sqlite3的时候,里面有一个回调函数,但是获取数据之后我想要把我获取的数据拿出来,找不到其他的办法。callback函数中的第一个参数就是传参的,这也是我能够想到的唯一切口了。

static int callback(void *data, int argc, char **argv, char **azColName)

但是他是void类型的,传进来结构体的地址之后,就需要注意了,需要强制类型转换,但是又不能直接转换,需要重新定义一个结构体指针,再进行强制类型转换。
还需要注意的就是结构体里面的变量不能赋初始值,默认为0。
源代码如下,大家可以去调试试试看,主要看代码:14.15.16行理解就可。

  1 #include 
  2 #include 
  3 #include 
  4 #include 
  5 #include 
  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 }

这样里面的函数将信息传进结构体,外面的函数也可以调用啦!

void*类型强制转换结构体指针类型_第1张图片

如果有更好的方法感谢提出~

你可能感兴趣的:(C语言,Sqlite3,c语言,sqlite3,linux)