You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

sqlite3_exec回调函数第一个参数类型转换报错求助

问题解决

你的代码里有几个关键错误导致编译失败,逐一修正如下:

1. 结构体定义语法错误

typedef_struct 是拼写错误,正确写法是 typedef struct。

2. 回调函数中类型转换的优先级问题

编译器报错的核心原因是:-> 运算符的优先级高于强制类型转换。你直接写 (OBJ_DATA *)adat->cvalue,编译器会先尝试访问 adat->cvalue,但 adat 是 void* 类型,无法直接用 -> 访问成员,所以触发报错。

必须把强制转换后的指针整体用括号括起来,确保先完成类型转换,再访问结构体成员。同时你的 strcpy 参数写法也有括号缺失问题,需要一并修正。

3. 其他细节问题

  • main 函数需要明确返回类型 int。
  • ErrMsg 应该声明为 char *ErrMsg = NULL;,符合 sqlite3_exec 的参数要求。
  • sqlite3的回调函数需要返回int值,通常返回0表示继续执行后续逻辑。

修正后的完整代码

typedef struct obj_data {
    int ivalue;
    char cvalue[200];
} OBJ_DATA;

OBJ_DATA adat;

static int callback_Members(void *adat, int argc, char** argv, char** azColName)
{
    // 先将void*强制转换为OBJ_DATA*,再访问结构体成员
    strcpy( ((OBJ_DATA *)adat)->cvalue, argv[0]);
    return 0;
}

int main()
{
    sqlite3 *db = NULL;
    char *sql_command = "SELECT ..."; // 替换为你的实际查询语句
    char *ErrMsg = NULL;
    int rc;

    // 省略打开数据库的代码...

    rc = sqlite3_exec(db, sql_command, callback_Members, &adat, &ErrMsg);
    if (rc != SQLITE_OK) {
        // 错误处理逻辑
        sqlite3_free(ErrMsg);
    }

    // 省略关闭数据库等后续代码...
    return 0;
}

内容的提问来源于stack exchange,提问作者Jeff McKay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 02:32:50