Я новичок в использовании вектора, мне нужен метод, который возвращает addres вектора, это код semplifide:
класс:
#include<vector>
class A
{
private:
std::vector<int> v;
public:
A()
{
for (int i = 0; i < 5; i++)
v[i] = i;
}
std::vector<int> give()
{
return v;
}
~A() {}
};
главный:
#include <iostream>
#include "class.cpp"
int main(int argc, char **argv)
{
A a;
int *vptr = NULL;
vptr = &a.give()[0];
std::vector<int> b;
return 0;
}
этот код компилируется, но во время выполнения предоставляется ошибка сегментации
Этот конструктор
A(){
for(int i = 0; i < 5; i++)
v[i] = i;
}
недействителен, поскольку вектор не имеет еще элементов, которые вы могли бы использовать оператор индекса. Правильнее было бы написать
A() : v( 5 ) {
for(int i = 0; i < 5; i++)
v[i] = i;
}
Что касается вашего вопроса, тогда std :: vector имеет данные функции-члена, которые возвращают адрес своего внутреннего буфера с элементами.
Так что вы могли бы написать
int * give(){ return v.data(); }
или
const int * give() const { return v.data(); }
В основном вы могли бы написать
int *vptr = a.give();
std::iota
.
У вас здесь несколько больших проблем.
Во-первых, в конструкторе вы пытаетесь получить доступ к элементам вектора, которые еще не существуют:
A(){
for(int i = 0; i < 5; i++)
v[i] = i;
}
vector
не совпадает с map
где, если элемент, который вы ищете с помощью operator[]
, не существует, создается новый. В vector
если вы используете operator[]
с индексом, который не существует, вы получаете Undefined Behavior и вероятный сбой. Здесь вы должны вставлять элементы. На пути push_back
:
A(){
for (int i = 0; i < 5; ++i)
v.push_back (i);
}
Далее, give()
возвращает vector
значение:
std::vector<int> give(){
return v;
}
Которая делает копию v
и возвращает эту копию. Хорошо, что технически хорошо, но когда вы вызываете give()
вы не присваиваете возвращаемое значение переменной. В конечном итоге копия вектора становится временным объектом. Как только делается так называемое "полное выражение", в котором было создано временное, временное уничтожение.
Это полное выражение:
vptr = &a.give()[0];
Таким образом, vptr
был назначен адрес первого элемента этого временного vector
, но как только достигнут конец этого выражения, этот вектор уничтожается, а vptr
теперь указывает на гиперпространство. Если вы попытаетесь разыменовать этот дикий указатель, вы получите Undefined Behavior и очень вероятную ошибку сегментации.
Чтобы исправить это, вы можете позволить A
рассказать вам адрес первого элемента vector
:
class A
{
// [...]
public:
void* give() { return v.data(); }
};