Странная ошибка пути к файлу строки базы данных sqLite - PullRequest
1 голос
/ 05 июня 2011

Итак, я планирую использовать sqlite3 для обновления файла main.db скайпа.

Я использую функцию sqlite3_open, чтобы открыть соединение следующим образом.

int rc = sqlite3_open(filepath,db);

Я пытаюсь создать строку filepath динамически, но странная ошибка сводит меня с ума.

У меня есть две строки szFile и szFilePath, szFile - тестовая строка, которая будет содержать фактический путь к файлу db, а szFilePath - это та же строка, только на этот раз динамически генерируемая функцией.

Дело в том, что перед выполнением функции sqlite3_open обе строки, как вы видите на скриншоте, идентичны, я даже разместил память для вас.

Посмотрите на картинки: Изображение 1 Изображение 2

Теперь, несмотря на то, что я полностью идентичен, независимо от того, сколько раз я запускаю этот код, работает ТОЛЬКО szFile, при этом другой выдает ошибку «не удается открыть путь к файлу» и полностью сбивает меня с толку. Кроме того, я не знаю, если это нормально, но установив точку останова на следующем if, я вижу, что szFilePath теряет свое значение (заполняется шестнадцатеричными значениями c).

Что может быть не так?

Ответы [ 3 ]

2 голосов
/ 05 июня 2011

Вы возвращаете символ *, который указывает на массив в стеке - как только вы вернетесь из функции szGetFilePath, этот указатель вполне может указывать на мусор (он определенно будет указыватьк ненужным после нескольких уровней дополнительных вызовов - когда значения в стеке перезаписаны).

Вы можете либо вернуть динамически распределенный массив char (т.е. malloc ed) из функции (и запомнитьfree позже), или передайте указатель на массив символов в szGetFilePath и поместите в него символьные данные.

0 голосов
/ 05 июня 2011

szGetFilePath возвращает ссылку на локальную переменную (szPathAppData). По возвращении из вызова функции начинается разматывание стека.

 char* szGetFilePath( char* szAccountName )
 {
     char *szPathAppData = calloc(128,1) ; // Allocating memory on heap
     // ....

     return szPathAppData ;
 }

  // You need to free the resources acquired on heap by using free.
  //  free(szPathAppData) ;
0 голосов
/ 05 июня 2011

C не моя сильная сторона, но, возможно, вы не отправляете через строку UTF-16 функцию, которая принимает строку UTF-8?
http://sqlite.org/c3ref/open.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...