Узнать конец динамического массива

125
31 декабря 2020, 01:20

Как можно узнать размер динамического массива, например int* или как получить указатель на его конец.

P.S. массив передается в функцию типа foo(int *).

Answer 1

Программист сам должен позаботиться о размере выделенной памяти. Если приложение не критично к скорости выполнения, обычно создают по быстрому свой класс указателя с этими данными. Можно писать как вам удобно, например так:

// g++ -Wall -Wpedantic pointertoarray.cpp
# include <iostream>
template<class T>
class PointerToArray{
public :
  PointerToArray(T*t,size_t n = 1):p(t),s(n){}
  PointerToArray(PointerToArray const & x):p(x.p),s(x.s){}
  T & operator  *()const{return  * p;}
  T * operator  ->()const{return  p;}
  T & operator [](size_t i)const{return *(p + i) ; }
  T * operator +(size_t i)const{return p + i ; }
  T * begin()const{return p ;}
  T * end()const{return p + s ;}
  size_t size()const{return s;}
private :
  T * p ;
  size_t s ;
};
void g(PointerToArray<int> px) {
  std::cout << "size of array is "<<px.size()<<std::endl;
  std::cout << "px[5]=="<<px[5]<<std::endl;
  std::cout << "*(px+5)=="<<(*(px+5))<<std::endl; }
int main() {
  int * xp = new int[10];
  xp[5]=777;
  PointerToArray<int> px(xp,10);
  g(px);
  delete[]xp; }

результат:

> ./a.out 
size of array is 10
px[5]==777
*(px+5)==777
Answer 2

В общем случае - никак.

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

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

PS. В C++ лучше вообще отказаться от динамических массивов и использовать стандартные контейнеры array или vector. При необходимости стыковки с внешним кодом, они легко преобразуются в указатель на массив.

READ ALSO
Ссылка на динамический массив в виде аргумента функции

Ссылка на динамический массив в виде аргумента функции

У меня есть динамический массив, пишу функцию для "печати" значенийСоздаю указатель на массив uint8_t в кол-ве count и сразу обнуляю значения:

90
На jQuery по клику удалить часть строки &lt;li&gt;

На jQuery по клику удалить часть строки <li>

Есть выпадающий список ul li, который появляется при клике по полю инпутаДо клика ul li не существует на странице

113
Имитация ввода текста

Имитация ввода текста

В данном коде текст вставляется в форму сразу весьКак сделать что-то на подобии animate(), чтобы пользователь видел как в форме печатается автоматически...

129