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

SQLite回调中如何将void*指针转换为二维String数组指针?

如何通过void*传递二维String数组并正确转换

我正在使用一个要求函数参数为void*的库(SQLite的sqlite3_exec()函数),需要将二维String数组通过该参数传递,并在回调函数内部提取使用。目前已成功传递数组指针,但转换时出现编译错误。

现有代码

String str_array[100][10];

int callback(void* data) {
  String* str_array_ptr[100][10] = (String* [100][10])data;
  (*str_array_ptr)[0][0] = "text";
  return 0;
}

void test() {
  callback(&str_array);
}

编译错误

error: ISO C++ forbids casting to an array type 'String* [100][10]' [-fpermissive]

问题分析与解决方法

C++不允许直接将void*强制转换为数组类型,需匹配原数组的指针类型来转换:

方法一:转换为指向二维数组的指针

二维数组String str_array[100][10]的地址类型是String (*)[100][10],可以直接用static_cast完成转换:

int callback(void* data) {
    // 将void*转换为指向二维数组的指针
    String (*str_array_ptr)[100][10] = static_cast<String (*)[100][10]>(data);
    // 通过解引用指针访问原数组
    (*str_array_ptr)[0][0] = "text";
    return 0;
}

方法二:转换为指向数组行的指针

由于二维数组在内存中是连续存储的,也可以将void*转换为指向数组第一行的指针(类型为String (*)[10]),这种方式更简洁:

int callback(void* data) {
    // 将void*转换为指向包含10个String的数组的指针
    String (*str_array_ptr)[10] = static_cast<String (*)[10]>(data);
    // 直接使用数组下标访问,和原数组用法一致
    str_array_ptr[0][0] = "text";
    str_array_ptr[99][9] = "last element";
    return 0;
}

错误原因说明

原代码中试图将void*转换为String* [100][10](二维指针数组类型),但原变量是String类型的二维数组,二者类型完全不匹配,因此触发编译错误。

SQLite场景补充

sqlite3_exec()是SQLite提供的一步式查询执行接口,用于执行SQL语句并通过回调函数处理查询结果。回调函数会在每一行结果生成时被调用,你可以利用传递的二维数组存储每一行的列数据。需要注意确保数组大小足够容纳查询结果,避免内存越界问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 03:05:01