通过指针改变函数的向量

时间:2018-03-29 13:06:59

标签: c++ string pointers vector append

新手在cpp,无法理解出了什么问题:

void addElem(vector<someCustomByteType> *result, string str_to_add) {
  someCustomByteType *elem = (someCustomByteType*)str_to_add.data();
  int elem_size = str_to_add.size();
  memcpy(&(*result).back(), elem, elem_size);
}
int main(int argc, _TCHAR* argv[])
{
  vector<someCustomByteType> vec(5);
  vector<someCustomByteType> *vec_ptr = &vec;
  addElem(signed_string_ptr, "abcd");
  return 0;
}

外面,主要:

外面的矢量没有改变。但memcpy有效。这是怎么回事? 谢谢!

2 个答案:

答案 0 :(得分:2)

该功能没有意义。

首先,目前还不清楚为什么要使用指向矢量的指针而不是对矢量的引用。

Nevertheles,这个宣言

vector<unsigned char> vec(5);

没有为矢量设置内存。它使用5个零字符初始化向量,该字符将附加到函数中的其他字符。

表达式

&(*result).back()

返回对向量的最后一个元素的引用。这个电话

memcpy(&(*result).back(), elem, elem_size);

将尝试覆盖不属于该向量的内存。结果,该函数具有未定义的行为。

你可以通过以下方式想象这种情况

   vector
|0|0|0|0|0|
        |a|b|c|d|
         string

因此可以看到有人试图将字符“b”,“c”和“d”复制到不属于该向量的内存中。

您应该使用类模板std::vector的方法来追加新元素。

该函数可以按照以下方式显示,如演示程序中所示(假设您要使用指向矢量的指针)。

#include <iostream>
#include <vector>
#include <string>

void addElem( std::vector<unsigned char> *result, const std::string &str_to_add ) 
{
    result->reserve( result->size() + str_to_add.size() );
    result->insert( result->end(), str_to_add.begin(), str_to_add.end() );
}   

int main() 
{
    std::vector<unsigned char> vec;
    std::vector<unsigned char> *vec_ptr = &vec;

    addElem( vec_ptr, "abcd" );

    for ( auto c : *vec_ptr ) std::cout << c;
    std::cout << std::endl;

    return 0;
}

它的输出是

abcd

答案 1 :(得分:0)

您正在做的是未定义的行为。 std::vectorstd::string都不是可复制的,这是std::memcpy的要求。如果您想将std::string复制到std::vector,您可以执行类似

的操作
void addString(vector<unsigned char>& vec, const std::string& str)
{
    vec.assign(str.begin(), str.end());
}