使用字符串的 c_str() 并分配给 char const*:分配只读位置

Using String's c_str() and assigning to char const*: assignment of read-only location

本文关键字:分配 char const 位置 只读 字符串 str      更新时间:2023-10-16

我的问题是这样的:我有一个指向常量字符指针的常量指针(两个维度都const的 2D 字符数组(。我需要将 C 字符串分配给这个数组。我有一个std::string s的std::vector,我用它来c_str()来创建c_strings向量。现在我将这些 C 字符串指针分配给这个数组,但我得到

src/rshell.cpp:45:44: error: assignment of read-only location ‘*(c_arr 
((sizetype)(((long unsigned int)i) * 8ul)))’
for (int i = 0; i < size1; i++) c_arr[i] = commands.at(i);

这是带有错误的代码

/* Confusing as heck, let me explain!
 * char const* means pointer to a constant char
 * so char const* const means a const pointer to a const char
 * and char const* const* means a const pointer to a const char pointer!
 * (Read declarations from right to left to make it make sense -
 *  char const* = POINTER (*) to a CONST CHAR)
 */
char const* const* c_arr = new char*[size1];
for (int i = 0; i < size1; i++)
  c_arr[i] = commands.at(i); // line 38

这是字符串到 C 字符串部分的矢量,如果它有帮助的话。

for (tokenizer::iterator it = parse.begin(); it != parse.end(); it++)
  words.push_back(*it);
vector<const char*> commands;
// add string to c_string equiv return vector
for (vector<string>::iterator it = words.begin(); it != words.end(); it++) {
    commands.push_back(it->c_str());
}

由于commands是一个std::vector<const char *>,表达式&commands[0]将产生一个const char **(也称为char const **(,你可以愉快地将其分配给char const * const *。因此,除非您真的需要副本,否则您可以选择

char const * const *c_arr = &commands[0];

请注意,这意味着c_arr实际上只有在commands存在时才有用(反过来,只要words中的std::string对象存在,它实际上才有用(。