使用String的c_str()并赋值给char const *:指定只读位置

时间:2015-02-16 19:29:57

标签: c++ c-strings c-str

我的问题是: 我有一个常量char指针的常量指针(2D char数组,其中两个维度都是const)。我需要为这个数组分配C字符串。我有std::vector std::stringc_str(),我使用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); 来创建c_strings的向量。现在我将这些C字符串指针分配给这个数组,但我得到了

/* 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

这是带错误的代码

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());
}

如果有帮助的话,这里是C-string部分的字符串向量。

{{1}}

1 个答案:

答案 0 :(得分:1)

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

char const * const *

请注意,这意味着只要char const * const *c_arr = &commands[0]; 存在,c_arr才真正有用(只有commands中的std::string对象才真正有用存在)。