C++ 从矢量到数组的转换:长度正好变为4
我有一个字符向量:C++ 从矢量到数组的转换:长度正好变为4,c++,arrays,vector,C++,Arrays,Vector,我有一个字符向量: vector<char> bytesv; 我知道这个向量的精确值是1024。执行以下操作时,它将打印1024: cout << bytesv.size() << "\n"; 问题:但当我打印此数组的大小时,它会打印4,因此大小不是我预期的大小: cout << sizeof(bytes) << "\n"; 这显然与字节实际上是字符*这一事实有关,而不是真正的数组。 问题是:如何将向量的所有内容安全地传输到数组中
vector<char> bytesv;
我知道这个向量的精确值是1024。执行以下操作时,它将打印1024
:
cout << bytesv.size() << "\n";
问题:但当我打印此数组的大小时,它会打印4
,因此大小不是我预期的大小:
cout << sizeof(bytes) << "\n";
这显然与字节
实际上是字符*
这一事实有关,而不是真正的数组。
问题是:如何将向量的所有内容安全地传输到数组中?这是因为
任何指针的大小都是4(在32位目标上)。什么
给您的是指向第一个元素的指针,不一定是字符数组
现在,如果您使用:
char (*bytes)[1024] = (char (*)[1024])&v[0];
std::cout << sizeof(bytes) << " " << sizeof(*bytes);
char(*字节)[1024]=(char(*)[1024])&v[0];
std::coutsizeof(bytes)
是指针的大小,而不是指针指向的内容。而且
char* bytes = &bytesv[0];
不将任何内容传输到数组,只需在std::vector
中保存一个指向基础数组开头的指针
要正确地将数据移动到阵列,需要动态分配阵列。但问题是你为什么要这么做?你已经有一个向量了。它就像一个数组,但比数组好10亿倍。sizeof(bytes)
总是4,因为*bytes
是一个指针,而您使用的机器使用的是4字节指针
您已经知道您有1024个字节;只要运用这些知识
那么,如何安全地将向量的所有内容传输到一个数组中呢
无需“转移”(即复制)。您可以使用data
方法以数组的形式访问向量的底层存储
char*arr=bytesv.data()代码>
字节实际上是字符*,而不是数组
char*
不是数组,而是指向数组中第一个值的指针。您可以从bytesv.size()
那么,如何安全地将向量的所有内容传输到一个数组中呢
使用动态内存分配来分配所需的内存
size_t size = bytesv.size();
char* char_array = new char[size];
将元素从向量复制到数组
for ( size_t i = 0; i < size; ++i )
char_array[i] = bytesv[i];
话虽如此,我意识到你在评论中提到
我的最终目标是使用fstream
将这些字节保存到一个文件中,就我而言,这需要一个字符数组
无需将向量的内容复制到数组中即可将其保存到fstream
。保证std::vector
的内容在连续内存中。您只需使用:
outStream.write(bytesv.data(), bytesv.size());
首先:您需要将向量的内容复制到数组中——否则,当向量消失时,您将无法访问数组的元素。因此,您需要为数组分配内存(而不仅仅是定义指针)
我需要将这个向量转换成与向量长度和元素相同的字符数组(char[])。为什么?vector
内部是一个刚刚包装好的字符数组。只需调用vector::data()
即可访问该数组。我的最终目标是使用fstream将这些字节保存到一个文件中,就我而言,fstream需要一个字符数组。@Momo那么您应该能够在编码时使用“bytes”变量,并从该向量中获取长度。“你已经有了一个向量。它就像一个阵列,但要比它好上十亿倍。”+1@developerbmw,很好地为简单的指针(据我所知)。指向成员的指针可能取决于类层次结构的结构。@developerbmw facepalm::blush::我想现在已经晚了,没有完全清楚地思考。谢谢。不用担心,我们都有这样的时刻:)正确但不必要删除[]
丢失,您泄漏了内存。@developerbmw。您认为哪一部分是不必要的?@RSahu副本。OP在评论中提到,他需要字符数组输出到文件,因此不需要数据的完整副本。但我明白这实际上不在问题中,所以仍然是一个很好的答案:)不需要使用较慢的at()
,使用运算符[]
OP提出的问题是“将向量的所有内容传输到数组中”,而不是“像数组一样访问向量”“。因此,复制操作是必要的。@Constantin,严格来说不是真的,因为OP在另一条注释中提到了最终目标,即使用fstream
@Constantin将数据写入文件,因为OP尝试使用此char*bytes=&bytesv[0]显然他实际上并不需要拷贝。他只是想以数组的形式访问数据。@developerbmw不,这并不明显,因为问题说明了其他一些事情。他是一个初学者,所以更有可能的是,他不了解内存管理的基础知识(复制操作是将数据从向量传输到数组所必需的)。他的问题不是:如何使用fstream
将向量
写入文件:你没有回答他提出的问题,而是一个不属于问题一部分的特定问题-如果希望按照OP最初的问题做,这对任何将来发现这个问题的人来说都是恼火的。
char (*bytes)[1024] = (char (*)[1024])&v[0];
std::cout << sizeof(bytes) << " " << sizeof(*bytes);
char* bytes = &bytesv[0];
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;
outStream.write(bytesv.data(), bytesv.size());
char* bytes = new char[bytesv.size()];
for (size_t i = 0; i < bytesv.size(); ++i) {
bytes [i] = bytesv.at(i);
}
//...
delete[] bytes;
#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;
}