将 std::vector::d ata 传递给函数期望类型**(双指针)
Passing std::vector::data to function expecting type** (double pointer)
正如标题所描述的,我试图将指向std::vector
数据的指针传递到一个期望双指针的函数中。以下面的代码为例。我有一个 int 指针d
它作为&d
传递给myfunc1
(仍然不确定是称它为指针的引用还是什么(,其中函数将其引用更改为填充1,2,3,4
的 int 数组的开头。但是,如果我有整数std::vector
并尝试传递&(vec.data())
以myfunc1
编译器会抛出错误lvalue required as unary ‘&’ operand
。根据这个答案,我已经尝试了类似(int *)&(vec.data())
的东西,但它不起作用。
仅供参考,我知道我可以做类似myfunc2
的事情,我直接将向量作为参考传递并且工作就完成了。但我想知道是否可以将myfunc1
与 std::vector 的指针一起使用。
任何帮助将不胜感激。
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
void myfunc1(int** ptr)
{
int* values = new int[4];
// Fill all the with data
for(auto& i:{0,1,2,3})
{
values[i] = i+1;
}
*ptr = values;
}
void myfunc2(vector<int> &vec)
{
int* values = new int[4];
// Fill all the with data
for(auto& i:{0,1,2,3})
{
values[i] = i+1;
}
vec.assign(values,values+4);
delete values;
}
int main()
{
// Create int pointer
int* d;
// This works. Reference of d pointing to the array
myfunc1(&d);
// Print values
for(auto& i:{0,1,2,3})
{
cout << d[i] << " ";
}
cout << endl;
// Creates the vector
vector<int> vec;
// This works. Data pointer of std::vector pointing to the array
myfunc2(vec);
// Print values
for (const auto &element : vec) cout << element << " ";
cout << endl;
// This does not work
vector<int> vec2;
vec2.resize(4);
myfunc1(&(vec2.data()));
// Print values
for (const auto &element : vec2) cout << element << " ";
cout << endl;
return 0;
}
编辑:我的实际代码所做的是从磁盘读取一些二进制文件,并将部分缓冲区加载到矢量中。我在从读取函数中获取修改后的向量时遇到了麻烦,这就是我想出的让我能够解决它的方法。
当你写:myfunc1(&(vec2.data()));
您正在获取右值的地址。尖头int*
是如此的临时,在呼叫后立即被销毁。
这就是您收到此错误的原因。
但是,正如@molbdnilo所说,在您的myfunc1()
函数中,您正在重新分配指针(顺便说一下,您不在乎破坏以前分配的内存(。
但std::vector
已经自行管理其数据存储器。你不能,也绝不能把手放在上面。
我的实际代码所做的是从磁盘读取一些二进制文件,并将部分缓冲区加载到矢量中。
一种解决方案可能是通过将迭代器传递到所需部分的开头和迭代器到所需部分的末尾来构造std::vector
以提取构造函数的参数。
例如:
int * buffer = readAll("path/to/my/file"); // Let's assume the readAll() function exists for this example
// If you want to extract from element 5 to element 9 of the buffer
std::vector<int> vec(buffer+5, buffer+9);
如果std::vector
已存在,则可以像在myfunc2()
中一样使用assign()
成员函数:
vec.assign(buffer+5, buffer+9);
当然,在这两种情况下,您都必须确保在访问缓冲区时不会尝试访问越界元素。
问题是你不能获取data()
的地址,因为它只是指针的临时副本,所以写入指向它的指针没有多大意义。这样就好了。您不想将data()
传递给此函数,因为它会用新数组覆盖指针,并且会破坏向量。您可以从函数中删除一个*
,并且只分配给它,而不在那里分配内存。这将起作用,但请确保在调用者中分配内存(使用resize
,只是reserve
将导致未定义的行为,因为data()
只是指向有效范围[data(), data() + size())
开头的指针。范围[data(), data() + capacity ())
不一定有效。
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 根据实例化点期望不同的类型
- 将 std::vector::d ata 传递给函数期望类型**(双指针)
- C++ MIDL2025:期望类型规范接近" "
- 期望一个类型,得到一个模板
- C 期望类对象的类型说明符
- 缩写对成员函数期望引入类型(ENUM类)的论点
- 格式“%lf”期望“ double *”类型的论点,但参数2具有“ poly term **”类型
- 类型名称不允许和期望)
- 我有 3 个错误:期望一个")",期望一个表达式,long 类型的参数与 U32 类型的参数不兼容
- 为什么 boost::bind 存储传入类型的参数,而不是函数期望的类型
- 通过用户类型对象将值分配给Chaisiscript变量会产生不期望的行为
- 在c++中期望各种参数类型
- std::throw_with_nested期望c++ 11中的多态类型
- Boost Python运行时错误,将派生类型的对象从Python传递给c++函数,期望将shared_ptr传递给基类
- C++ iStream 运算符>>期望任意输入类型
- 将intptr_t传递给期望int类型的函数是否安全?
- Node.js c++绑定错误:'('标记之前期望的构造函数、析构函数或类型转换
- 期望的类型说明符