Создание 2D-массива char * заполняет его данными из sqlite в функции обратного вызова

В моей функции я вызываю rc = sqlite3_exec(db, sqlStatement, callback, &a, &zErrMsg); с функцией callback . В этой функции callback я хочу заполнить 2D-массив 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"] 

EDIT: Это был мой предыдущий вопрос

Я не считаю его документированным, но кажется вероятным, что строки argv переданные в ваш обратный вызов, хороши только до тех пор, пока обратный вызов не вернется. Я не вижу, как SQLite может работать иначе – обратный вызов не отвечает за управление памятью для этих строк, поэтому SQLite должен делать это внутренне.

Поэтому вместо записи исходных указателей строк в вашем массиве дублируйте строки и сохраняйте указатели на дубликаты. MSVC ++ предоставляет strdup() , поэтому вы можете добиться этого, заменив …

  char *s = argv[i]; 

… с …

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

, Имейте в виду, что тем самым вы берете на себя ответственность за освобождение этих строк, когда вы закончите с ними.