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

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 }

这样里面的函数将信息传进结构体,外面的函数也可以调用啦!
在这里插入图片描述

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

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值