Как узнать размер динамического массива в C++ [дубликат]
этот вопрос уже есть ответ здесь:
код для динамического массива путем ввода размера и сохранения его в переменную "n", но я хочу получить длину массива из метода шаблона, а не с помощью "n".
int* a = NULL; // Pointer to int, initialize to nothing.
int n; // Size needed for array
cin >> n; // Read in the size
a = new int[n]; // Allocate n ints and save ptr in a.
for (int i=0; i<n; i++) {
a[i] = 0; // Initialize all elements to zero.
}
. . . // Use a as a normal array
delete [] a; // When done, free memory pointed to by a.
a = NULL; // Clear a to prevent using invalid memory reference.
этот код похож, но с использованием динамический массив:
#include <cstddef>
#include <iostream>
template< typename T, std::size_t N > inline
std::size_t size( T(&)[N] ) { return N ; }
int main()
{
int a[] = { 0, 1, 2, 3, 4, 5, 6 };
const void* b[] = { a, a+1, a+2, a+3 };
std::cout << size(a) << 't' << size(b) << 'n' ;
}
1 ответов
вы не можете. Размер массива, выделенного с помощью new[]
не хранится каким-либо образом, в котором он может быть доступен. Обратите внимание, что возвращаемый тип new []
- это не массив - это указатель (указывающий на первый элемент массива). Так что если вам нужно знать длину динамического массива, вы должны хранить его отдельно.
конечно, правильный способ сделать это, избежав new[]
и с помощью std::vector
вместо этого, который хранит длину для вас, и это исключение-безопасно сапог.
вот как будет выглядеть ваш код с помощью std::vector
вместо new[]
:
size_t n; // Size needed for array - size_t is the proper type for that
cin >> n; // Read in the size
std::vector<int> a(n, 0); // Create vector of n elements initialised to 0
. . . // Use a as a normal array
// Its size can be obtained by a.size()
// If you need access to the underlying array (for C APIs, for example), use a.data()
// Note: no need to deallocate anything manually here