我是使用vector的新手,我需要一个返回向量的addres的方法,这是简单的代码:
类:
#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;
}
此代码编译但在执行期间给出了分段错误
答案 0 :(得分: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();
答案 1 :(得分:-1)
这里有几个大问题。
首先,在构造函数中,您尝试访问尚不存在的向量元素:
A(){
for(int i = 0; i < 5; i++)
v[i] = i;
}
vector
与map
不同,如果您使用operator[]
查找的元素不存在,则会创建新元素。在vector
中,如果您使用不存在索引的operator[]
,您将获得未定义的行为,并且可能会崩溃。你应该在这里插入物品。途中是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
现在指向到了超空间。如果您尝试取消引用此Wild指针,则会出现Undefined Behavior并且很可能出现分段错误。
要解决此问题,您可以让A
告诉您vector
的第一个元素的地址:
class A
{
// [...]
public:
void* give() { return v.data(); }
};