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
相关产品推荐
相关产品推荐

