【发布时间】:2013-11-11 16:30:12
【问题描述】:
我将在这里使用一个伪示例,尽管我在几个 API 中注意到了这种行为,例如 sqlite3 或 windows。
假设一个函数是这样声明的:
void Fu(some_identifier **ppBar);
我在我的代码中这样做:
some_identifier **ppFubar;
fu(ppFubar);
据我了解,这会起作用,而且确实适用于我自己的功能。然而,当我使用某些 API 执行此操作时,我的程序在缓冲区溢出后崩溃。
如果我这样做:
some_identifier *pFubar;
fu(&pFubar);
一切都很好。
ppFubar 和 &pFubar 的计算结果不完全相同吗?
编辑:
一个具体的例子是(第四个参数):
int sqlite3_prepare(
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 */
);
【问题讨论】:
-
“一些 API”很可能需要你分配一些东西并通过它。
-
也许问题出在其他地方,例如在取消引用的指针指向的范围内。
-
仅当您初始化 ppFubar 以指向某个
*some_identifier时。如果不是,它只是一个未初始化的悬空指针。 -
它们具有相同的结果类型,但它们的共同点仅此而已
标签: c++ function pointers arguments