Двумерный массив (матрица) не является массивом указателей.
new char[c][256]
Выражения выделяет двумерный массив, массив c
одномерных массивов каждый из размера 256. Результат представляет собой указатель на первый такой элемент, т.е. char(*)[256]
.
Наоборот, переменная-указатель, которую вы пытаетесь инициализировать, имеет тип char**
, что является указателем на указатель на char
. Обычно это указатель на первый элемент в массиве указателей на char
. Эта структура не соответствует тому, что вы выделили.
Двумерный массив называется матрицы.
В контексте исходных массивов C и C++ этот термин подразумевает по умолчанию массив массивов.
Массив указателей на массивы называется массивом jagged, поскольку он может иметь (указатели) массивы разных размеров. Например, математическая матрица, значения которой симметричны по диагонали, может храниться в массивах размеров 1, 2, 3 и т. Д. В некоторых случаях зубчатые массивы также используются для реализации квадратных матричных матриц.
Хорошим решением является вместо исходных массивов, используйте vector
из string
:
vector<string> commands;
Таким образом, вы даже не должны определять размер фронт.
И пользователю не нужно указывать размер, вы можете только push_back
каждой новой команды.
vector
Здесь находится std::vector
из заголовка <vector>
и string
является std::string
из заголовка <string>
.
Для чтения команд, то вы можете использовать std:.getline
, а также из <string>
заголовка, который избегает чтений только один разделенных пробелов “ ” слова в то время: он читает целую строку в то время.
Объявление 'команд' должно быть' char (* commands) [256] = ... '. это указатель на строку из 256 символов. У вас есть 'c' этих строк. Увеличение этого указателя увеличивает его на 256 байт, то есть на следующую строку, что, вероятно, желательно. Как вы уже догадались, письмо 256 буквально является ужасной идеей. Почти так же страшно использовать исходные указатели и выделения. –