Использование cring st_str () и присвоение char const *: назначение места только для чтения

Моя проблема заключается в следующем:
У меня есть постоянный указатель на постоянный указатель на символ (2D-массив символов, где оба измерения const). Мне нужно назначить C-строки для этого массива. у меня есть std::vector из std::stringы, которые я использовал 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());
}

0

Решение

поскольку 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 объекты в words существовать).

1

Другие решения


По вопросам рекламы [email protected]