我有一个字符向量:
vector<char> bytesv;
我使用push_back(char)在循环中对这个向量推送1024个字符(对上下文不重要):
bytesv.push_back(c);
我知道此向量的精确值为1024.执行以下操作时,它会打印1024
cout << bytesv.size() << "\n";
我想做的事情: 我需要将此向量转换为与向量相同长度和元素的char数组(char [])。我执行以下操作:
char* bytes = &bytesv[0];
问题:但是当我打印这个数组的大小时,会打印4
,所以大小不是我的预期:
cout << sizeof(bytes) << "\n";
完整代码:
vector<char> bytesv;
for (char c : charr) { // Not important, there are 1024 chars in this array
bytesv.push_back(c);
}
cout << bytesv.size() << "\n";
char* bytes = &bytesv[0];
cout << sizeof(bytes) << "\n";
打印:
1024
4
这显然与bytes
实际上是char*
的事实有关,而不是真正的数组AFAIK。
问题: 如何安全地将所有矢量的内容传输到数组中呢?
答案 0 :(得分:3)
如何安全地将所有矢量的内容传输到数组中呢?
使用动态内存分配来分配所需的内存。
size_t size = bytesv.size();
char* char_array = new char[size];
将元素从向量复制到数组。
for ( size_t i = 0; i < size; ++i )
char_array[i] = bytesv[i];
确保在使用完内存后取消分配内存。
delete [] char_array;
说完了,我意识到你在评论中提到了
我的最终目标是使用
fstream
将这些字节保存到文件中,就我而言,这需要一系列字符。
您不需要将矢量的内容复制到数组中以将其保存到fstream
。 std::vector
的内容保证在连续的内存中。你可以使用:
outStream.write(bytesv.data(), bytesv.size());
答案 1 :(得分:2)
sizeof(bytes)
是指针的大小,而不是指向的大小。此外,
char* bytes = &bytesv[0];
不会将任何内容传输到数组中,您所做的就是保存指向std::vector
中基础数组开头的指针。
要将数据正确地移动到数组,您需要动态分配数组。但问题是你为什么这样做?你已经有了一个矢量。它就像一个数组,但要好十亿倍。
答案 2 :(得分:1)
如何安全地将所有矢量的内容传输到数组中呢?
无需“转移”(即复制)。您可以使用data
方法将矢量的底层存储作为数组访问。
char* arr = bytesv.data();
http://en.cppreference.com/w/cpp/container/vector/data
字节实际上是一个char *,而不是一个真正的数组
char*
不是数组,而是指向数组中第一个值的指针。您可以从bytesv.size()
答案 3 :(得分:0)
那是因为sizeof
任何指针都是4(在32位目标上)。什么
char* bytes = &bytesv[0];
给你的是一个指向第一个元素的指针,而不一定是一个字符数组。
现在如果您使用:
char (*bytes)[1024] = (char (*)[1024])&v[0];
std::cout << sizeof(bytes) << " " << sizeof(*bytes);
会给你一个指向'char [1024]'数组的指针。
答案 4 :(得分:0)
sizeof(bytes)
总是4,因为*bytes
是一个指针而你正在使用一个使用4字节指针的机器。
你已经知道你有1024个字节;只是使用这些知识。
答案 5 :(得分:0)
首先:您需要将向量的内容复制到数组中 - 否则当向量消失时,您无法访问数组的元素。因此,您需要为数组分配内存(而不仅仅是定义指针)。
char* bytes = new char[bytesv.size()];
for (size_t i = 0; i < bytesv.size(); ++i) {
bytes [i] = bytesv.at(i);
}
//...
delete[] bytes;
其次sizeof()没有做到你期望的事情:它不报告数组的长度,而是报告类型/指针的大小。在堆栈分配的数组的情况下,它可以用作:sizeof(array)/sizeof(array[0]);
来确定大小,但由于sizeof()
是编译时运算符,它无法知道动态分配数组的大小或载体
如果使用数组,则需要使用单独的变量来存储此数组的长度(或者您可以使用std::array代替)。
#include <iostream>
#include <string>
#include <vector>
int main(int argc, char* argv[]){
std::vector<uint8_t> bytesv = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
size_t bytesLength = bytesv.size();
char* bytes = new char[bytesLength];
for (size_t i = 0; i < bytesv.size(); ++i) {
bytes[i] = bytesv.at(i);
}
//...
std::cout << bytesLength << std::endl;
delete[] bytes;
return 0;
}