【问题标题】:Passing a vector to a function as void pointer将向量作为 void 指针传递给函数
【发布时间】:2013-01-27 07:55:05
【问题描述】:

我有一个回调函数,它将void * 作为参数传递给它,我想将一个向量传递给函数。该函数将被多次调用,因此在回调过程完成后,我希望能够通过回调遍历所有已push_back()'ed 的元素。

static void cb(void *data)
{
    vector<int> *p = static_cast<vector<int>*>(data); //Attempting to convert *void to vector<int>
    p->push_back(1);
}

int main()
{
    vector<int> a(10); //Max of 10 push_back()s? vector<int> a; gives memory error.
    cb((void*)&a.at(0));
    cout << a.at(0); //Gives a random number of 6 digits or higher
}

问题是在回调之后调用a.at(0) 时它的值不正确为“1”,只是一些随机数。

【问题讨论】:

  • void * 在 C++ 中通常是一种较小的技术。
  • @chris 我知道 :( 我正在尝试使用用 C 编写的 lib-Sqlite3。

标签: c++ pointers vector void


【解决方案1】:

假设你不能改变cb()的签名,试试这个:

cb(static_cast<void*>(&a));

【讨论】:

  • void *时也不需要演员表。
  • 谢谢。我认为演员阵容将是说明性的,即使没有必要。
  • @user99545 - 欢迎您。如果可以的话,请更改回调接口的签名。在void* 之间进行转换是一种糟糕的技术。
【解决方案2】:

这里:

cb ((void*)&a.at(0));

你传递一个指向向量第一个元素的指针,而不是向量本身,而是在这里:

vector <int> *p = static_cast <vector <int> *> (data);

您将传递的数据转换为指向向量的指针,这可能是未定义的行为。如果你想传递指向整个向量的指针,像这样传递:

cb ((void *)&a);

如果你真的想传递一个指向向量元素的指针,那么你应该这样转换:

int * = static_cast <int *> (data);

【讨论】:

    【解决方案3】:

    在 C++11 中,你有 vector::data:

    cb(a.data());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-08
      • 2013-06-25
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      • 2019-01-28
      相关资源
      最近更新 更多