Инициализация и навигация по символу**

Итак, рассмотрим этот код:

char** pool = new char*[2];
pool[0] = new char[sizeof(char)*5];

Насколько я знаю, это создает указатель на массив из двух указателей на символы. Затем вторая строка устанавливает первый из этих двух указателей на первый элемент в массиве из 5 символов. Пожалуйста, поправьте меня, если я ошибаюсь.

Если я не ошибаюсь:

  1. Как мне инициализировать все эти символы?
  2. Как бы я изменил конкретный символ? Например, установка последнего символа в NULL в каждом массиве.

person scorkla    schedule 25.01.2014    source источник
comment
для части «как» персонаж"> stackoverflow.com/questions/12935752/   -  person user2485710    schedule 26.01.2014


Ответы (1)


Насколько я знаю, это создает указатель на массив из двух указателей на символы. [...]

char** pool = new char*[2];

Нет, эта строка создает указатель на указатель на символ. Выражение в правой части создает массив из двух указателей на символы. Вы можете инициализировать этот двойной указатель массивом указателей, потому что правая часть будет распадаться на двойной указатель.

Затем вторая строка устанавливает первый из этих двух указателей на первый элемент в массиве из 5 символов. [...]

pool[0] = new char[sizeof(char)*5];

Что вы подразумеваете под первым из этих двух указателей на символы. Вы назначаете только один указатель в этой строке.

Как мне инициализировать все эти символы?

Используя цикл для перебора указателей и выделения им действительной памяти.

Как бы я изменил конкретный символ? Например, установка последнего символа в NULL в каждом массиве.

for (char** p = pool; p != (pool + 2); ++p)
{
    *p = new char[/* amount of chars */];
    (*p)[/* amount of chars */] = '\0';
}

Но это полный бардак. Было бы значительно проще использовать вектор строк:

std::vector<std::string> pool;
person 0x499602D2    schedule 25.01.2014
comment
Спасибо, похоже, у меня было довольно много ошибок. Спасибо за разъяснение и упрощение. Согласен, полный бардак. - person scorkla; 31.01.2014