在我的函数中,我使用rc = sqlite3_exec(db, sqlStatement, callback, &a, &zErrMsg);
函数调用callback
函数。
在这个callback
函数中,我想用数据库中的数据填充二维char *数组。
struct mytable
{
char ***data;
size_t dim;
};
static int callback(void *data, int argc, char **argv, char **azColName)
{
struct mytable *old = (mytable *)data;
char ***temp;
old->dim++;
temp = (char ***)realloc(old->data, old->dim * sizeof(*old->data));
if (temp)
{
old->data = temp;
old->data[old->dim - 1] = NULL;
}
else
{
logging_logError("Kein virtueller RAM mehr vorhanden ... !", __FILE__);
return EXIT_FAILURE;
}
for (int i = 0; i < old->dim; i++)
{
char **temp2 = (char **)realloc(old->data[i], sizeof(argv) * sizeof(*old->data[i]));
if (temp2)
{
old->data[i] = temp2;
old->data[i][argc - 1] = NULL;
}
else
{
logging_logError("Kein virtueller RAM mehr vorhanden ... !", __FILE__);
return EXIT_FAILURE;
}
}
/*Here I try to store the data from each column
in the corresponding position in the 2D array of char* */
for (int i = 0; i < argc; i++)
{
char *s = argv[i];
temp[old->dim - 1][i] = s;
}
return 0;
}
当我打印出我返回的数据时,我会得到一些神秘的迹象。 我想要的是这样的(在数组结构中):
["1"]["Paul"]["street 1"]["some address"]
["2"]["Anna"]["street asdf"]["some address"]
["3"]["Martin"]["street bfg"]["some address"]
修改 这是我以前的question
答案 0 :(得分:2)
我没有特别记录它,但似乎很可能传递给你的回调的argv
字符串只有在回调返回之前才有效。我没有看到SQLite如何工作 - 回调不负责管理这些字符串的内存,因此SQLite必须在内部执行此操作。
因此,不是在数组中记录原始字符串指针,而是复制字符串,并存储指向重复项的指针。 MSVC ++提供strdup()
,因此您可以通过替换...来实现这一目标。
char *s = argv[i];
...与......
char *s = strdup(argv[i]);
。请注意,通过这样做,您将承担在完成这些操作后释放这些字符串的责任。