我有一个像这样的缓冲区:
vector<unsigned char> buf
如何将其转换为char *?
如果我这样做:
(char *)buf
我收到此错误:
/home/richard/Desktop/richard/client/src/main.cc:102: error: invalid cast from type ‘std::vector<unsigned char, std::allocator<unsigned char> >’ to type ‘char*’
对于那些想知道我为什么要这样做的人。我需要将缓冲区传递给这个函数:
n_sent = sendto(sk,(char *)buf,(int)size,0,(struct sockaddr*) &server,sizeof(server));
它只接受char *。
答案 0 :(得分:51)
reinterpret_cast<char*> (&buf[0]);
向量保证其元素占用连续的内存。所以你寻找的“数据”实际上是第一个元素的地址(小心vector <bool>
,这个技巧会失败)。另外,为什么不是你的缓冲区vector<char>
,所以你不需要reinterpret_cast?
reinterpret_cast<char*>(buf.data());
答案 1 :(得分:6)
reinterpret_cast<char*>(buf.data());
答案 2 :(得分:4)
尝试
(char *)(&buf[0])
或其他更多C ++演员。但是也要告诉我们你用的是什么。这可能是一个坏主意。
答案 3 :(得分:2)
您不太可能希望将vector<unsigned char>
强制转换为unsigned char *
,但您可以获得这样的有效指针:
vector<unsigned char> v;
unsigned char *p = &*v.begin();
这个奇怪的表达式将为您提供指向由向量创建的内部分配数组的开头的指针。如果您完全修改了矢量,它可能不再有效。
冗余查找&*
的原因是*
在operator *
返回的迭代器上确实是v.begin()
。它返回对数组的第一个char的引用,然后您可以使用&
的地址。