SQLite 3语句准备段错误

时间:2015-01-22 21:36:17

标签: c sqlite segmentation-fault

我在我的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;
}

1 个答案:

答案 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;
}