创建一个char *的2D数组,用回调函数中的sqlite数据填充它

时间:2016-10-18 20:46:21

标签: c arrays sqlite malloc

在我的函数中,我使用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

1 个答案:

答案 0 :(得分:2)

我没有特别记录它,但似乎很可能传递给你的回调的argv字符串只有在回调返回之前才有效。我没有看到SQLite如何工作 - 回调不负责管理这些字符串的内存,因此SQLite必须在内部执行此操作。

因此,不是在数组中记录原始字符串指针,而是复制字符串,并存储指向重复项的指针。 MSVC ++提供strdup(),因此您可以通过替换...来实现这一目标。

        char *s = argv[i];

...与......

        char *s = strdup(argv[i]);

。请注意,通过这样做,您将承担在完成这些操作后释放这些字符串的责任。