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

0

Есть ли способ узнать длину/количество указателей в массиве указателей?

т.е.

class Notifications {   
    iMessage **messages;
public:
    Notifications();
    Notifications(const Notifications&);
    Notifications& operator=(const Notifications&);
    Notifications(Notifications&&);
    Notifications&& operator=(Notifications&&);
    ~Notifications();
    void operator+=(const w5::iMessage&);
    void display(std::ostream&) const;

}

Как я смогу найти количество указателей в массиве?

  • 3
    простой простой массив не скажет вам, что
  • 0
    Адрес объекта iMessage хранится в массиве указателей, поэтому сообщения iMessage **
Показать ещё 9 комментариев
Теги:
arrays
pointers

2 ответа

3
Лучший ответ

У вас есть три варианта, в порядке повышения доброты:

Сделайте последнее значение null, а все остальные - ненулевым. Это единственное решение, которое требует что-то из ваших данных, считайте его как строку c-style, за исключением указателей вместо char s.

for (iMessage** msg  = messages; *msg; ++msg) { ... }

Сохраните размер вместе с вашими сообщениями:

iMessage **messages;
const size_t size;

for (size_t i = 0; i < size; ++i) {
    iMessage* msg = messages[i];
    // ...
}

Используйте контейнер, специально предназначенный для хранения произвольного количества материала в непрерывной памяти:

std::vector<iMessage*> messages;

for (iMessage* msg : messages) { 
    // ...
}

Это в основном это, если вы не знаете размер messages спереди и это константа времени компиляции, и в этом случае один из:

iMessage* messages[100];
std::array<iMessage*, 100> messages; 

дает вам размер в типе.

  • 0
    Это сделал это, спасибо.
0

Нет стандартного способа сделать это. Некоторые компиляторы имеют функции, чтобы вернуть размер выделенного блока, например _msize в Visual Studio. Если вы разделите это по размеру указателей, вы получите количество элементов в вашем "массиве".

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

Правильный способ сделать это (вместо того, чтобы угадывать размер от указателя), это позволить коду, который создал массив, передать размер вам и сохранить его вместе с указателем. Кроме того, вы можете использовать классы C++, которые сделают это для вас (и, возможно, также проведут проверку границ).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню