使用String的c_str()赋值给char const*:只读位置的赋值
Using String's c_str() and assigning to char const*: assignment of read-only location
我的问题是:
我有一个指向常量字符指针的常量指针(二维字符数组,其中两个维度都是 const
)。我需要将 C 字符串分配给这个数组。我有一个 std::string
的 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
存在时才有用(反过来,只要 std::string
中的对象存在 [=20] =]存在)。
我的问题是:
我有一个指向常量字符指针的常量指针(二维字符数组,其中两个维度都是 const
)。我需要将 C 字符串分配给这个数组。我有一个 std::string
的 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
存在时才有用(反过来,只要 std::string
中的对象存在 [=20] =]存在)。