gpt4 book ai didi

c - 为什么对于 sqlite3_open 我们使用双指针 ** 而对于 sqlite3_prepare 我们使用指针 *

转载 作者:太空宇宙 更新时间:2023-11-04 02:36:26 25 4
gpt4 key购买 nike

不对的地方请指正

我读了这个答案https://stackoverflow.com/a/833124/5175709我的理解是,由于对象可能会扩展并耗尽空间,因此内存位置也会发生变化。但是这里有两个 sqlite3 语法以不同方式引用对象。为什么?

sqlite3_open 我们有:sqlite3 **ppDb

SQLITE_API int SQLITE_STDCALL sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */

对于 sqlite3_prepare 我们有:sqlite3 *db

SQLITE_API int SQLITE_STDCALL sqlite3_prepare_v2(
sqlite3 *db, /* Database handle */
const char *zSql, /* SQL statement, UTF-8 encoded */
int nByte, /* Maximum length of zSql in bytes. */
sqlite3_stmt **ppStmt, /* OUT: Statement handle */
const char **pzTail /* OUT: Pointer to unused portion of zSql */

最佳答案

sqlite3_open 需要以某种方式给你一个数据库连接对象;即 sqlite3 对象。

为了防止人们访问内部结构,sqlite3.hsqlite3 声明为不透明结构。这意味着您不能为 sqlite3 分配空间,因为您不知道它包含什么; SQLite 库必须为您分配它并为您提供指向它的指针 (sqlite3*)。

所以现在我们有一个假设函数 sqlite3* sqlite3_open(...);,它打开一个数据库并返回一个指向连接对象的指针。但是等一下;如果发生错误怎么办?我们可以返回 NULL,但开发人员应该如何区分“数据库不存在”错误与“数据库只读”、“数据库已损坏”或其他错误?

因此,sqlite3_open 返回一个整数返回码,如果打开成功,则将连接指针写入 ppDB 参数指向的内存。

sqlite3_open 通常这样使用:

sqlite3* myDB;
int status = sqlite3_open("/path/to/db", &myDB);
if(status != SQLITE_OK) {
// error occured
return;
}
// sqlite3_open wrote a database pointer to myDB, use it here
status = sqlite3_prepare_v2(myDB, "SELECT * FROM whatever", -1, NULL, NULL);
// ...

关于c - 为什么对于 sqlite3_open 我们使用双指针 ** 而对于 sqlite3_prepare 我们使用指针 *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36610518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com