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

Posted

技术标签:

【中文标题】将已知长度的 char 指针转换为 char 向量而不分配新内存【英文标题】:convert char pointer with known length to vector of char without allocate new memory 【发布时间】:2015-06-29 09:10:56 【问题描述】:

我尝试从给定的 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;

但这不起作用输出是:

测试值 测试

但如果他们在同一内存上工作,那一定是:

测试 测试

有什么办法吗?

【问题讨论】:

vectors 复制您提供给他们的任何内容,vector 的全部意义在于管理其内容的生命周期,如果您不需要,请不要使用。 【参考方案1】:

但是如果他们在同一个内存上工作

答案是,它们不能在相同的内存上工作。当你构造一个向量时,它会为自己分配空间并复制内容。

因此,您得到的行为是正确且符合预期的。

要实现您想要的,请为向量编写自定义内存分配器。

【讨论】:

【参考方案2】:

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

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

无论如何,这是 C++,所以无论如何你都不应该经常使用vector&lt;char&gt;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().

【讨论】:

【参考方案3】:

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

如果您像以前一样将数组作为参数,它将分配一个相同大小的新数组并从源复制内容。

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 tan C++ 实践。考虑了解std::string 对象以进行字符操作。

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于将已知长度的 char 指针转换为 char 向量而不分配新内存的主要内容,如果未能解决你的问题,请参考以下文章

指针类型转换:对缓冲区长度的影响?

无法将字符串转换为 const char/string* 到 int*

在c++中实现,如何创建一个char的数组

将 char 指针存储在向量中

将 vector<string> 转换为 char** 会导致分段错误

将 char 数组转换为结构指针