我在我的C应用程序中使用SQLite 3。到目前为止,当我开始编写单元测试时,它就像一个魅力。有问题的功能非常小。它打开一个内存数据库,准备一个语句,然后用它做一些事情。问题是应用程序在sqlite3_prepare_v2
函数调用时因分段错误而崩溃。我试图调试它并检查所有参数是否有效,它们似乎是。
下面,我粘贴了一个以同样方式导致段错误的最小示例。回溯将sqlite3LockAndPrepare
列为崩溃的函数(由sqlite3_prepare_v2
调用)。
正如我上面提到的,我在我的应用程序的其余部分使用SQLite没有任何问题。我只是无法弄清楚使用的差异是什么,因为它分成几个不同的例程,也可以做其他事情。我可以发现的一件事是使用内存数据库而不是磁盘,但我在磁盘上尝试使用它,它没有任何区别。
#include <stdlib.h>
#include <stdio.h>
#include <sqlite3.h>
int main(void)
{
sqlite3 *db;
sqlite3_stmt **stmt;
const char *str = "CREATE TABLE Test (t1 varchar(8) NOT NULL);";
if (SQLITE_OK != sqlite3_open(":memory:", &db)) {
printf("Can't open...\n");
return 1;
}
sqlite3_prepare_v2(db, str, -1, stmt, NULL);
return 0;
}
答案 0 :(得分:1)
sqlite3_prepare_v2()
的第四个参数应该是指向sqlite3_stmt *
的有效指针。您正在传递未定义的值(因为您的变量stmt
从未初始化)。 (另请注意,即使没有使程序崩溃,也无法以这种方式接收指向预准备语句的指针。)
你应该这样做,而不是:
int main(void)
{
sqlite3 *db;
sqlite3_stmt *stmt;
const char *str = "CREATE TABLE Test (t1 varchar(8) NOT NULL);";
/* ... create database ... */
sqlite3_prepare_v2(db, str, -1, &stmt, NULL);
return 0;
}