Вы разыменовываете data
, переданное CallBack
в ((char **)data)[index]
, но его значение было передано из data
в Select
через обратный вызов sqlite3_exec
.data
in Select
было выделено для in:
char **data = (char **)malloc(0);
Вы не можете разыменовать указатель на распределение нулевой длины.Также обратите внимание, что поведение malloc
нулевого размера определяется реализацией, поэтому его следует избегать (как и malloc
в C ++ в любом случае в предпочтении new
).
Послеedit:
Теперь data
возвращается из Select
без какой-либо записи в него, но затем разыменовывается в
returnData[0]
в FunctioForThread
.Это неопределенное поведение.
Более того, sizeof(argv[i - index])
не возвращает длину строки, на которую указывает argv[i - index]
.Он вернет размер указателя типа.Вероятно, поэтому ваши ассигнования будут слишком малы, опять же неопределенное поведение.Используйте std::strlen
, чтобы получить длину строки с нулевым символом в конце.
Тогда указатель argv[i - index]
также может быть NULL
, чтобы указать значение NULL
в возвращенной строке (см. Документацию ).sqlite3_exec
).В этом случае strcpy
извлечение из него также будет неопределенным поведением.
Цикл while (dataToReturn[index])
вызовет неопределенное поведение, поскольку массив для dataToReturn
был выделен, но его элементы никогда не установлены.Даже если значения были заданы, обратите внимание, что условие выполняется тогда и только тогда, когда строка в стиле C dataToReturn[index]
указывает на нулевую длину.Если такая строка не существует в выделенном диапазоне, снова поведение не определено.
У вас также есть утечки памяти, потому что вы никогда не free
какие-либо из ваших malloc
ed данных и потому что dataToReturn
отбрасывается в конце каждого вызова CallBack, это не очень полезно.
Нет веских оснований для использования всех этих конструкций в стиле C.Используйте new
вместо malloc
, std::string
и std::vector
вместо char
массивов, std::cout
и std::cerr
вместо printf
и fprintf(stcerr, ...
, std::thread
вместо pthreads
.Единственный момент, когда эти вещи необходимо учитывать, - это граница интерфейса с библиотекой C.