Как объявить и инициировать двухмерный массив строк?

мне нужно что-то вроде этого

const char **nodeNames[] =
{
{"RootNode", "Reference", "Node_1", "Node_2", "Node_3"},
{"RootNode", "Hips", "Node_1", "Node_2", "Node_3"},
{"RootNode", "Heviest", "Node_1", "Node_2", "Node_3"},
};

но с предыдущим объявлением я получил ошибку.

И как я могу ссылаться на это в коде?

0

Решение

Похоже, вы хотите двумерный массив const char*:

const char *nodeNames[][5] =
{                 // ^^ this dimension can be deduced by the compiler, the rest not
{"RootNode", "Reference", "Node_1", "Node_2", "Node_3"},
{"RootNode", "Hips", "Node_1", "Node_2", "Node_3"},
{"RootNode", "Heviest", "Node_1", "Node_2", "Node_3"}
};

Обратите внимание, что вам нужно явно указать все, кроме размера основного измерения.

Это не ведет себя точно так же, как трехмерный массив символов, потому что ваши строки имеют разный размер. Я надеюсь, что вы знаете об этом, и вы не будете, например, разыменование nodeNames[0][2][7], который бы выходил за пределы конца "Node_1",

3

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

Зависит немного от того, что вы хотите. Это даст вам 2D массив строк:

const char *nodeNames[][20] =
{
{"RootNode", "Reference", "Node_1", "Node_2", "Node_3"},
{"RootNode", "Hips", "Node_1", "Node_2", "Node_3"},
{"RootNode", "Heviest", "Node_1", "Node_2", "Node_3"},
};

Это даст вам массив указателей на массив строк.

const char *node1[] = {"RootNode", "Reference", "Node_1", "Node_2", "Node_3"};
const char *node2[] = {"RootNode", "Hips", "Node_1", "Node_2", "Node_3"};
const char *node3[] = {"RootNode", "Heviest", "Node_1", "Node_2", "Node_3"};

const char **nodeNames2[] =
{
node1,
node2,
node3,
};

Обратите внимание, что они несколько отличаются друг от друга тем, что первый хранится в массиве (поэтому существует непрерывное хранилище указателей на строки 3 * 20), где второй хранит только адрес первого указателя в массиве указателей. , которые в свою очередь указывают на строку. Там нет смежного хранилища, только три указателя.

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

Для правильного трехмерного массива символов:

const char nodeNames3[3][5][12] =
{
{"RootNode", "Reference", "Node_1", "Node_2", "Node_3"},
{"RootNode", "Hips", "Node_1", "Node_2", "Node_3"},
{"RootNode", "Heviest", "Node_1", "Node_2", "Node_3"},
};

Это сохраняет все символы в непрерывной памяти, то есть 3 * 5 * 12 байтов.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector