最近我想将向量转换为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;
为什么会发生字符串崩溃? 不再有安全的方法了吗?
答案 0 :(得分:1)
使用memcpy
时,不能保证arr[i]
是一个以空值结尾的字符串。将arr[i]
视为以null结尾的字符串,如
cout << arr[i] << endl;
导致未定义的行为。
您需要进行一些小改动。
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;