我尝试从给定的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;
}
但这不起作用,输出是:
测试值
测试
但如果他们在相同的记忆中工作,那一定是:
测试
测试
有没有办法呢?
答案 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编写一个自定义分配器,并为你的局部变量使用类似的内存分配策略。