新手在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有效。这是怎么回事? 谢谢!
答案 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::vector
或std::string
都不是可复制的,这是std::memcpy
的要求。如果您想将std::string
复制到std::vector
,您可以执行类似
void addString(vector<unsigned char>& vec, const std::string& str)
{
vec.assign(str.begin(), str.end());
}