Как определить размер массива строк в C++?

Я пытаюсь просто распечатать значения, содержавшиеся в массиве.

У меня есть массив строк, названный 'результатом'. Я не знаю точно, насколько большой это - потому что это было автоматически сгенерировано.

Из того, что я читал, можно определить размер массива путем выполнения этого:

sizeof(result)/sizeof(result[0])

Это корректно? Поскольку для моей программы, sizeof (результат) = 16 и sizeof (результат [0]) = 16 так, чтобы код сказал бы мне, что мой массив имеет размер 1.

Однако это не кажется корректным, потому что, если я вручную распечатываю значения массива как это:

std::cout << result[0] << "\n";
std::cout << result[1] << "\n";
std::cout << result[2] << "\n";
std::cout << result[3] << "\n";
etc...

... тогда я вижу получающиеся значения, которые я ищу. Массив имеет вверх 100 + значения в длине/размере.

Кажется, что должно быть очень просто определить размер/длину массива... так, надо надеяться, я просто пропускаю что-то здесь.

Я - что-то вроде C++ newb, таким образом, любая справка ценилась бы.

12
задан Jake Wilson 16 February 2010 в 04:51
поделиться

6 ответов

В C++ нельзя определить размер массива динамически. Вы должны передавать размер в качестве параметра.

В качестве побочного примечания, использование контейнера Стандартной библиотеки (например, вектора) облегчает эту задачу.

В вашем примере sizeof, sizeof(result) запрашивает размер указателя (предположительно std::string). Это происходит потому, что фактический тип массива "распадается" на тип указателя на элемент при передаче функции (даже если функция объявлена как принимающая тип массива). Функция sizeof(result[0]) возвращает размер первого элемента вашего массива, который, по совпадению, также равен 16 байтам. Похоже, что на вашей платформе указатели имеют размер 16 байт (128-бит).

Помните, что sizeof в C++ всегда оценивается во время компиляции, и никогда во время выполнения.

11
ответ дан 2 December 2019 в 06:08
поделиться

В векторной строке используйте метод size ()

0
ответ дан 2 December 2019 в 06:08
поделиться

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

3
ответ дан 2 December 2019 в 06:08
поделиться

В качестве дополнительного комментария, есть более эффективные способы проверки размера массива (для случаев, когда массив находится в области видимости и не превратился в указатель), которые являются типизированными:

// simple: runtime result
template <typename T, std::size_t N>
inline std::size_t sizeof_array( T (&)[N] ) {
   return N;
}

// complex: compile time constant
template <typename T, std::size_t N>
char (&static_sizeof_array( T(&)[N] ))[N];   // declared, not defined
#defined SIZEOF_ARRAY( x ) sizeof(static_sizeof_array(x))

В обоих случаях компилятор будет определить, пытаетесь ли вы передать указатель (динамический массив или разрушенный массив):

void f( int array[] ) { // really: void f( int *array )
{
//   sizeof_array(array);              // compile time error
//   int another[SIZEOF_ARRAY(array)]; // compile time error
}
int main() {
   int array[] = { 1, 2, 3 };
   std::cout << sizeof_array(array) << std::endl; // prints 3
   int another_array[ SIZEOF_ARRAY(array) ];
   std::cout << sizeof_array(another_array) << std::endl; // 3 again
}
8
ответ дан 2 December 2019 в 06:08
поделиться

Лучше использовать std :: vector вместо необработанного массива. Тогда вам не нужно вручную управлять памятью массивов, и вы можете использовать метод size () , если хотите узнать количество элементов.

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

1
ответ дан 2 December 2019 в 06:08
поделиться

Обратите внимание: текст может быть представлен различными методами. Массив текста также может быть представлен различными методами.

Массив указателей на строки в стиле C

Распространенным методом является наличие массива указателей на char Проблема в том, что размер массива не представляет размер всего текста. Кроме того, должно быть установлено право собственности на данные или указатель, так как текст может быть удален (и может ли вызываемый объект удалить текст или вызывающий?).Поскольку это массив, размер массива всегда должен соответствовать массиву во всех параметрах (если только массив не всегда фиксированного размера).

Массив char - упакованный текст

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

Массив std :: string

В C ++ текст может быть представлен с помощью std :: string . В этом случае массив представляет количество строк (аналогично массиву C-Strings выше). Чтобы получить общий размер всех строк, необходимо суммировать размер каждой отдельной строки. Поскольку это массив, необходимо также передать размер массива.

Резюме

Во время выполнения размеры массива должны сопровождать массив, когда массив передается. sizeof обрабатывается только во время компиляции. Более простой структурой является std :: vector , которая динамически обрабатывает размер и распределение памяти.

0
ответ дан 2 December 2019 в 06:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: