我有一个回调函数,它以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”,只是一些随机数。
答案 0 :(得分:3)
假设您无法更改cb()
的签名,请尝试以下操作:
cb(static_cast<void*>(&a));
答案 1 :(得分:3)
下面:
cb ((void*)&a.at(0));
你将指针传递给向量的第一个元素,而不是向量本身,但是在这里:
vector <int> *p = static_cast <vector <int> *> (data);
您将传递的数据转换为指向向量的指针,这可能是未定义的行为。如果要将指针传递给整个向量,请按以下方式传递:
cb ((void *)&a);
如果你真的想传递一个指向矢量元素的指针,那么你应该像这样投射:
int * = static_cast <int *> (data);
答案 2 :(得分:2)
在C ++ 11中,您有vector::data
:
cb(a.data());