Передача вектора в функцию как указатель void

У меня есть функция обратного вызова, которая принимает 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
}

Проблема заключается в том, что он не имеет правильного значения «1», когда a.at(0) вызывается после обратного вызова, просто какое-то случайное число.

2

Решение

Предполагая, что вы не можете изменить подпись cb(), попробуй это:

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

Другие решения

Вот:

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());
2
По вопросам рекламы [email protected]