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::cout
sizeof(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]向量
    传输到数组所必需的)。他的问题不是:如何使用
    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;
    }