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

在我的函数中,我调用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 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 dim - 1][i] = s; } return 0; } 

当我打印出我返回的数据时,我得到了一些神秘的迹象。 我想要的是这样的(在数组结构中):

 ["1"]["Paul"]["street 1"]["some address"] ["2"]["Anna"]["street asdf"]["some address"] ["3"]["Martin"]["street bfg"]["some address"] 

编辑:这是我以前的问题

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

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

  char *s = argv[i]; 

…… ……

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

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