将已知长度的char指针转换为char向量而不分配新内存

时间:2015-06-29 09:10:56

标签: c++ pointers vector

我尝试从给定的char指针创建一个std::vector,并分配新的内存。这样他们就可以在相同的记忆中工作。

我试过了:

int main()
{
char* test1 = "test value";   

std::vector<char> testVector(test1, test1 + strlen(test1));
testVector[4] = 0;

std::cout << test1 << std::endl;
std::cout << &(testVector[0]) << std::endl;
}

但这不起作用,输出是:

  

测试值
  测试

但如果他们在相同的记忆中工作,那一定是:

  

测试
  测试

有没有办法呢?

4 个答案:

答案 0 :(得分:1)

  

但如果他们在相同的记忆中工作

答案是,它们不适用于相同的内存。构造向量时,它会为自己分配空间并复制内容。

所以,你得到的行为是正确和预期的。

要实现您的目标,请为vector编写自定义内存分配器。

答案 1 :(得分:1)

正如其他人所指出的那样,这是不可能做到的。每个新的vector都会为自己分配内存并复制字符串。没有办法解决这个问题。

如果您确定vector<char>const char *指向同一位置,则必须先创建vector<char>。但对于一个奇怪的问题,这是一个奇怪的解决方案。

无论如何,这是C ++,所以你不应该经常使用vector<char>char *。只需使用std:: string

#include <string>
int main()
{
    std:: string test_string = "test value";
    test_string.at(4) = '-';
    std::cout << test_string << std::endl;
}

并且很容易向string询问其底层(const)C数组,例如,如果您有旧的C代码,则必须与之接口。 const char * char_pointner = test_string.c_str()

答案 2 :(得分:0)

声明向量时,它总是分配一个新数组。

如果你像你一样给出一个数组作为参数,它将分配一个相同大小的新数组并从源代码复制内容。

使用std::vector无法执行此操作。如果要在同一阵列上使用不同的指针,则必须使用本机数组:

char  test1[] = "test value";
char* testPtr = test1;

testPtr[4] = 0;

std::cout << test1 << std::endl; // Print "test".
std::cout << testVector << std::endl; // Print "test" as well.

顺便说一句,正如您所看到的,您应该使用char []语法而不是char *声明您的第一个数组,否则您的变量将是只读的,并且您无法编辑它

注意:

即使它有效,这更像是一个C ++ C ++实践。考虑了解角色操作的std::string对象。

答案 3 :(得分:0)

目前你的char指针test1将其内存保留在堆栈中,但vector总是使用其默认分配器在堆中创建一个位置。

如果你需要实现这一点,你必须为vector编写一个自定义分配器,并为你的局部变量使用类似的内存分配策略。