Не получается изменить массив char

Код:

char** n = new char*[2];
n[1] = "ll";  // без этого след строка работает
n[1] = "k";
n[0] = "klk";
// n[0][1]='s'; тоже ошибка

cout << n << " " << n[0] << " " << n[0][1] << endl;

Ошибка:

does not allow conversion from string literal to 'char *'

Почему вылетает такая ошибка? По факту я просто хочу переименовать элемент массива.


Ответы (3 шт):

Автор решения: Ahmed_08

У Вас n это указатель на указатель, следовательно, Вам надо выделить память для каждого n[i]. То есть n[0] = new char[size]; n[1] = new char[size]; а потом можете заполнить n[i] строками

→ Ссылка
Автор решения: anton

Строковые литералы в C++ всегда являются константами, поэтому надо привести const char* ко char*:

#include <iostream>

int main()
{
    char** a = new char*[3];
    a[0] = (char*) "abc";
    a[1] = (char*) "def";
    a[2] = (char*) "ghi";
    for (size_t i = 0; i < 3; ++i)
    {
        std::cout << "a[" << i << "] = " << a[i] << "\n";
    }
    delete[] a;
    return 0;
}
a[0] = abc
a[1] = def
a[2] = ghi
→ Ссылка
Автор решения: Harry

Если вы планируете просто хранить массив строковых литералов, то можно просто добавить const:

const char** n = new const char*[2];
n[1] = "ll";  // без этого след строка работает
n[1] = "k";
n[0] = "klk";

cout << n << " " << n[0] << " " << n[0][1] << endl;

Но вот изменять строковые литералы нельзя, так что

n[0][1]='s';

так ошибкой и останется. Если вы хотите хранить копии литералов с правом их изменения — надо выделять место для них и копировать.

Но я бы в этом случае рекомендовал работать со строками string, и не массивами, а векторами.

Ведь у вас же С++, как-никак...

→ Ссылка