Вы не можете сделать это со списком, поскольку список сохраняет свои данные в узлах списка. Тем не менее, вы можете сделать это с вектором, который гарантированно хранит свои данные в непрерывном фрагменте памяти. Вы можете использовать &v[0]
или &*v.begin()
, чтобы получить указатель на его первый элемент:
void f(std::list<char>& list)
{
std::vector<char> vec(list.begin(),list.end());
assert(!vec.empty());
c_api_function(&vec[0],vec.size());
// assuming you need the result of the call to replace the list's content
list.assign(vec.begin(),vec.end());
}
Обратите внимание, что вектор автоматически освободит свою память, когда функция вернется.
Есть (по крайней мере) еще две примечательные вещи:
- Вектор не должен быть пустым. Вам не разрешен доступ к
v[0]
пустого вектора. (Вам также не разрешено разыменовывать v.begin()
.)
- Поскольку используется динамическое распределение, преобразование между
std::list
и std::vector
может привести к снижению производительности. Рассмотрите возможность переключения на std::vector
в целом.