C++ 多级指针作为参数c++;
我将在这里使用一个伪示例,尽管我在几个API(如sqlite3或windows)中注意到了这种行为 假设函数是这样声明的:C++ 多级指针作为参数c++;,c++,function,pointers,arguments,C++,Function,Pointers,Arguments,我将在这里使用一个伪示例,尽管我在几个API(如sqlite3或windows)中注意到了这种行为 假设函数是这样声明的: void Fu(some_identifier **ppBar); 我在我的代码中这样做: some_identifier **ppFubar; fu(ppFubar); 我的理解是,这将起作用,而且确实在我自己的职能中起作用。然而,当我使用一些API执行此操作时,我的程序在缓冲区溢出后崩溃 如果我这样做: some_identifier
void Fu(some_identifier **ppBar);
我在我的代码中这样做:
some_identifier **ppFubar;
fu(ppFubar);
我的理解是,这将起作用,而且确实在我自己的职能中起作用。然而,当我使用一些API执行此操作时,我的程序在缓冲区溢出后崩溃
如果我这样做:
some_identifier *pFubar;
fu(&pFubar);
一切都很好
ppFubar和&pFubar的评估结果是否完全相同
编辑:
一个具体的例子是(第四个论点):
你的理解是错误的 如果函数采用
某个标识符**ppFubar代码>参数它可能会在函数体的某个地方执行与某个标识符相关的操作
如果用某个标识符**ppFubar调用它代码>您正在给它一个未初始化的指针,即指向垃圾的指针。如果函数对其执行任何操作(例如,它取消引用它,一次或两次),则会导致未定义的行为(很可能会崩溃)
将正确初始化的指针传递给函数。您的理解是错误的
如果函数采用某个标识符**ppFubar代码>参数它可能会在函数体的某个地方执行与某个标识符相关的操作
如果用某个标识符**ppFubar调用它代码>您正在给它一个未初始化的指针,即指向垃圾的指针。如果函数对其执行任何操作(例如,它取消引用它,一次或两次),则会导致未定义的行为(很可能会崩溃)
将正确初始化的指针传递给函数。“某些API”可能需要您分配一些内容并传递它。可能问题出在其他地方,例如在它指向的对象上的取消引用指针的范围内。仅当您将ppFubar初始化为指向某个*某个\u标识符时。如果不是,它只是一个未初始化的悬空指针。它们具有相同的结果类型,但这就是它们的共同点“某些API”可能需要您分配一些内容并传递它。可能问题出在其他地方,例如,在其指向的对象上的取消引用指针的范围内。仅当您初始化ppFubar以指向某个*某个\u标识符时。如果不是,那只是一个未初始化的悬空指针。它们有相同的结果类型,但这就是它们的共同点。我编辑了我的问题,添加了一个示例API。对于此函数,我需要将ppStmt
初始化为*sqlite3\u stmt
?我假设API会使ppStmt
成为一个有效的指针,no?@user2731962您需要关于需要传递给函数的内容的文档。没有它,你就不能使用它。您作为示例发布的函数的文档记录非常糟糕,因为它没有准确地告诉您需要向它发送什么。这就是为什么让API使用双指针是个坏主意的原因之一。我编辑了我的问题,添加了一个示例API。对于此函数,我需要将ppStmt
初始化为*sqlite3\u stmt
?我假设API会使ppStmt
成为一个有效的指针,no?@user2731962您需要关于需要传递给函数的内容的文档。没有它,你就不能使用它。您作为示例发布的函数的文档记录非常糟糕,因为它没有准确地告诉您需要向它发送什么。这就是为什么让API使用双指针是个坏主意的原因之一。
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 */
);