C 开放数据库函数需要返回db对象,否则它就不能工作了?

C 开放数据库函数需要返回db对象,否则它就不能工作了?,c,sqlite,C,Sqlite,我在c中使用sqlite3,创建了一个名为open_database的函数,没有返回类型: void open_database(const char* database_name, sqlite3* db) 它所做的就是打开数据库: Doesnt work: void open_database(const char* database_name, sqlite3* db) { int return_code; return_code = sqlite3_open(d

我在c中使用sqlite3,创建了一个名为open_database的函数,没有返回类型:

void open_database(const char* database_name, sqlite3* db)
它所做的就是打开数据库:

Doesnt work: 

void open_database(const char* database_name, sqlite3* db) {

    int return_code;

    return_code = sqlite3_open(database_name, &db);

    if(return_code) {
        printf("Issue opening database\n");
        exit(1);
    } else {
        printf("Datbase Opened.\n");
    }
}


Works:

sqlite3* open_database(const char* database_name, sqlite3* db) {
    int return_code;

    return_code = sqlite3_open(database_name, &db);

    if(return_code) {
        printf("Issue opening database\n");
        exit(1);
    } else {
        printf("Datbase Opened.\n");
        return db;
    }
}
void create_table(sqlite3* db) {

    char* sql;
    char *zErrMsg = NULL;
    int return_code;

    /* Create SQL statement */
    sql = "CREATE TABLE COMPANY("  \
      "ID INT PRIMARY KEY     NOT NULL," \
      "NAME           TEXT    NOT NULL," \
      "AGE            INT     NOT NULL," \
      "ADDRESS        CHAR(50)," \
      "SALARY         REAL );";

    //printf("First Statement: %s\n", sql);

   /* Execute SQL statement */
   return_code = sqlite3_exec(db, sql, NULL, NULL, &zErrMsg);

   if( return_code != SQLITE_OK ){

      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      //printf("Error creating table.\n");
      sqlite3_free(zErrMsg);

   } else {
      fprintf(stdout, "Table created successfully\n");
   }

}
问题是,当我调用该函数并尝试在其他地方使用它时,它会失败,错误类型为NULL?(sqlite错误:(null))。但是如果我将它从void更改为sqlite3并返回db对象,它会工作吗

sqlite3* db;


Works: 

db = open_database("test_db", db);
create_table(db);
insert_into_table(db);
close_database(db);


Doesnt work: 

open_database("test_db", db);
create_table(db);
insert_into_table(db);
close_database(db);
我试图搜索文档和其他区域,但没有找到原因。任何关于为什么会发生这种情况的见解都将是令人敬畏的。谢谢

额外:

下面是使用数据库的函数之一:

Doesnt work: 

void open_database(const char* database_name, sqlite3* db) {

    int return_code;

    return_code = sqlite3_open(database_name, &db);

    if(return_code) {
        printf("Issue opening database\n");
        exit(1);
    } else {
        printf("Datbase Opened.\n");
    }
}


Works:

sqlite3* open_database(const char* database_name, sqlite3* db) {
    int return_code;

    return_code = sqlite3_open(database_name, &db);

    if(return_code) {
        printf("Issue opening database\n");
        exit(1);
    } else {
        printf("Datbase Opened.\n");
        return db;
    }
}
void create_table(sqlite3* db) {

    char* sql;
    char *zErrMsg = NULL;
    int return_code;

    /* Create SQL statement */
    sql = "CREATE TABLE COMPANY("  \
      "ID INT PRIMARY KEY     NOT NULL," \
      "NAME           TEXT    NOT NULL," \
      "AGE            INT     NOT NULL," \
      "ADDRESS        CHAR(50)," \
      "SALARY         REAL );";

    //printf("First Statement: %s\n", sql);

   /* Execute SQL statement */
   return_code = sqlite3_exec(db, sql, NULL, NULL, &zErrMsg);

   if( return_code != SQLITE_OK ){

      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      //printf("Error creating table.\n");
      sqlite3_free(zErrMsg);

   } else {
      fprintf(stdout, "Table created successfully\n");
   }

}
与此类似,当传入指针并试图通过调用
sqlite3\u open()
来修改它时,您正在修改该指针的本地副本。如果您将其返回,您将获得更改

如果您希望它返回void,请尝试这样定义它

void open_database(const char* database_name, sqlite3** db) {

    int return_code;

    return_code = sqlite3_open(database_name, db);

    if(return_code) {
        printf("Issue opening database\n");
        exit(1);
    } else {
        printf("Datbase Opened.\n");
    }
}
这样称呼它

sqlite3* db;
open_database("test_db", &db);

您能否发布有疑问的
open\u数据库
的实际实现?感谢您的编辑,但您能否提供
open\u数据库
的替代实现?没有理由传入指针-只需返回指针。并打开编译器的警告。那会给你错误的提示。谢谢所有的帮助。谢谢,我犯了愚蠢的错误。