Как получить количество элементов в массиве указателей? - PullRequest
0 голосов
/ 27 августа 2018

Как получить количество элементов в массиве указателей?

Ниже мой код:

struct mystruct     
{    
  int a;    
  char ch[10];    
  int c;    
};

mystruct *m_arr[2];

Я просматриваю этот массив в некоторых других файлах. Вместо жесткого кодирования как 2 в каждом файле я хочу получить количество элементов в массиве программно.

Ответы [ 7 ]

0 голосов
/ 27 августа 2018

Да, используйте std :: vector, но если вам нужно ...

это работает для c ++ 11 или выше:

template <typename T, std::size_t N>
constexpr std::size_t sizeofArray(T(&)[N]) {
    return N;
}

Недавно вы видели это в видео о 7 возможностях C ++, которые вы можете принять сегодня

0 голосов
/ 30 августа 2018

Предполагая, что ваш массив имеет следующий вид:

char *array[3];  

Добавить дополнительный элемент в массив, который считается ограничителем массива.

char *array[3]={"First element","Second element",""};

Все остальное зависит от вашего собственного стиля кодирования, вы можете проверить терминатор и подсчитать количество элементов, кроме завершающей строки.

0 голосов
/ 27 августа 2018

В C ++ 17 вы можете #include <iterator> и использовать std::size(m_arr).

0 голосов
/ 27 августа 2018

Вы всегда можете сделать такую ​​арифметику памяти:

size_t arraySize = sizeof(m_arr) / sizeof(m_arr[0]);

Но если у вас нет причины, как в Когда вы использовали бы массив вместо вектора / строки?:

Затем вы должны использовать std::array<mystruct*, 2> m_arr;, размер которого вы можете получить через m_arr.size(), и адрес базового собственного массива , который вы получитес m_arr.data().

0 голосов
/ 27 августа 2018

Если это заголовочный файл, включенный во все другие файлы исходного кода с использованием m_arr, вы можете использовать sizeof(m_arr)/sizeof(m_arr[0]), чтобы получить количество элементов в массиве. Но это действительно опасно. Если в какой-то момент указатель m_arr входит в функцию в качестве параметра, область действия функции будет возвращать не 2 при sizeof(m_arr), а число байтов, которое указатель берет в памяти, что, вероятно, равно 8.

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

0 голосов
/ 27 августа 2018

Обычный способ сделать это:

size_t sizeOfArray = sizeof(m_arr)/sizeof(m_arr[0]);

О size_t из вики :

size_t - это целочисленный тип без знака, используемый дляпредставлять размер любого объекта (включая массивы) в конкретной реализации. Оператор sizeof возвращает значение типа size_t .Максимальный размер size_t предоставляется через SIZE_MAX, макропостоянную, которая определена в заголовке (заголовок cstdint в C ++).size_t имеет ширину не менее 16 бит.

0 голосов
/ 27 августа 2018

Не используйте сырые массивы. Используйте стандартный контейнер, например std::vector или std::array. Оба они имеют член .size() и допускают синтаксис на основе диапазона:

    for (mystruct* p : m_arr)

Если вам нужна совместимость с C, они оба предлагают функцию-член data(), которая возвращает указатель на первый элемент в базовом массиве. (В вашем случае это будет mystruct **)


Редактировать: необработанный массив также поддерживает синтаксис, основанный на диапазоне - но только , если видимое объявление включает в себя количество элементов (поэтому my_struct* m_arr[2]; нормально, но my_struct* m_arr[] не будет работать) , Невозможно объявить std::array без определения размера. Другие контейнеры (например, std::vector) не включайте размер в декларацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...