ここでは疑似例を使用しますが、sqlite3 や windows などのいくつかの API でこの動作に気付きました。
関数が次のように宣言されているとします。
void Fu(some_identifier **ppBar);
そして、私は自分のコードでこれを行います:
some_identifier **ppFubar;
fu(ppFubar);
これが機能することは私の理解であり、実際に私自身の機能で機能します。しかし、いくつかの API でこれを行うと、バッファ オーバーフローの後でプログラムがクラッシュします。
私がこれを行う場合:
some_identifier *pFubar;
fu(&pFubar);
すべて順調。
ppFubar と &pFubar はまったく同じものに評価されませんか?
編集:
具体例は次のようになります (4 番目の引数):
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 */
);