如何将vector <string>转换为char * arr []?

时间:2019-11-14 04:59:13

标签: c++ arrays string pointers

最近我想将向量转换为char * array []。

所以我找到了解决方案。但这不是安全的方法。

这是我的代码

char** arr = new char* [4];

vector<string> vv;

// setting strings
for (int i = 0 ;i < 4; i++)
{
    vv.emplace_back("hello world");
}
// convert
for (int i = 0; i < 4; i++)
{
    arr[i] = new char[vv[i].size()];
    memcpy(arr[i], vv[i].c_str(), vv[i].size());
}

// prints
for (int i = 0; i < 4; i++)
{
    cout << arr[i] << endl;
}

// output
// hello world羲羲?솎솨
// hello world羲羲拂솽솨
// hello world羲羲
// hello world羲羲?펺솨

// delete memorys
for (unsigned index = 0; index < 4; ++index) {
    delete[] arr[index];
}

delete []arr;

为什么会发生字符串崩溃? 不再有安全的方法了吗?

3 个答案:

答案 0 :(得分:1)

使用memcpy时,不能保证arr[i]是一个以空值结尾的字符串。将arr[i]视为以null结尾的字符串,如

cout << arr[i] << endl;

导致未定义的行为。


您需要进行一些小改动。

  1. 再分配一个字节的内存。
  2. 使用strcpy代替memcpy
arr[i] = new char[vv[i].size() + 1];
strcpy(arr[i], vv[i].c_str());

答案 1 :(得分:0)

如果您可以保持初始vector的生命周期,那么有一种更简单的方法。

for (int i = 0; i < 4; i++)
{
    arr[i] = vv[i].c_str();
}

这样,您将不会分配任何额外的内存,但是,您必须记住,一旦初始vector被销毁,该数组也会被破坏。但是,如果您需要在同一线程内进行一些简单的同步api调用进行这种转换,那么就可以解决问题。

答案 2 :(得分:0)

在这种情况下,我通常使用这种丑陋的结构。

arr[i] = new char[vv[i].size() + 1];
arr[i][vv[i].copy(arr[i], vv[i].size())] = 0;