将向量作为void指针传递给函数

5

我有一个回调函数,它需要一个 void * 参数来传递参数,并且我想将一个向量传递给该函数。由于回调过程将被多次调用,因此在回调过程完成后,我想能够迭代所有通过回调函数 push_back() 的元素。

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",而是随机数。

2
在C++中,void *通常是一种较次的技术。 - chris
@chris 我知道 :( 我正在尝试使用用C语言编写的lib-Sqlite3。 - user99545
3个回答

5
假设你不能改变cb()的签名,那么可以试试这个方法:
cb(static_cast<void*>(&a));

1
当转到void *时,强制转换并不是必要的。 - chris
谢谢。我认为这个转换可能有说明作用,即使不是必要的。 - Robᵩ
1
@user99545 - 不用谢。如果可能的话,请更改回调接口的签名。强制转换到和从 void* 是一种糟糕的技术。 - Robᵩ

4

在这里:

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());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接