从向量到数组的转换:长度恰好为4

时间:2015-10-29 02:26:41

标签: c++ arrays vector

我有一个字符向量:

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。 问题: 如何安全地将所有矢量的内容传输到数组中呢?

6 个答案:

答案 0 :(得分:3)

  

如何安全地将所有矢量的内容传输到数组中呢?

  1. 使用动态内存分配来分配所需的内存。

    size_t size = bytesv.size();
    char* char_array = new char[size];
    
  2. 将元素从向量复制到数组。

    for ( size_t i = 0; i < size; ++i )
       char_array[i] = bytesv[i];
    
  3. 确保在使用完内存后取消分配内存。

    delete [] char_array;
    
  4. 说完了,我意识到你在评论中提到了

      

    我的最终目标是使用fstream将这些字节保存到文件中,就我而言,这需要一系列字符。

    您不需要将矢量的内容复制到数组中以将其保存到fstreamstd::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;
}