【问题标题】:Multi level pointer as argument c++多级指针作为参数 c++
【发布时间】: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


【解决方案1】:

你的理解是错误的。

如果函数采用some_identifier **ppFubar; 参数,它可能会在其函数体内某处执行与some_identifier 对象相关的操作。

如果你用some_identifier **ppFubar; 调用它,你会给它一个未初始化的指针,即一个指向垃圾的指针。如果函数对它做了任何事情(例如,它取消引用它,一次或两次),您将招致未定义的行为(很可能,它会崩溃)。

将正确初始化的指针传递给函数。

【讨论】:

  • 我编辑了我的问题以添加示例 API。对于此功能,我需要将 ppStmt 初始化为 *sqlite3_stmt 吗?我会假设 API 会使 ppStmt 成为有效指针,不是吗?
  • @user2731962 您需要有关需要传递给函数的内容的文档。没有它,您将无法使用它。您作为示例发布的函数的文档记录非常糟糕,因为它没有准确地告诉您需要发送给它的内容。这就是为什么让 API 采用双指针是一个坏主意的原因之一。
猜你喜欢
  • 1970-01-01
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多