Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多级指针作为参数c++;_C++_Function_Pointers_Arguments - Fatal编程技术网

C++ 多级指针作为参数c++;

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

我将在这里使用一个伪示例,尽管我在几个API(如sqlite3或windows)中注意到了这种行为

假设函数是这样声明的:

    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 */
);