Здесь я буду использовать псевдо-пример, хотя я заметил это поведение в нескольких API-интерфейсах, таких как sqlite3 или windows.Многоуровневый указатель как аргумент C++
Say функция объявлена следующим образом:
void Fu(some_identifier **ppBar);
и я делаю это в моем коде:
some_identifier **ppFubar;
fu(ppFubar);
Это мое понимание того, что это будет работать, и это действительно делает в моих собственных функций , Однако моя программа вылетает из-за переполнения буфера, когда я делаю это с некоторыми API.
Если я это сделать:
some_identifier *pFubar;
fu(&pFubar);
все в порядке.
Do ppFubar и & pFubar не оценивает то же самое?
EDIT:
Конкретный пример будет (четвертый аргумент):
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'. Если нет, это просто неинициализированный висячий указатель. – rici