Код некорректен — поведение неопределено. Почему: - После `v.reserve(222)` ёмкость вектора не меньше 222. - Два вызова `v.push_back(111)` и `v.push_back(222)` дают `size() == 222` и `capacity() >= 222`. - `int* p = &v[0];` даёт указатель на элемент в внутреннем массиве. - Следующий `v.push_back(333)` превышает текущую ёмкость 222, поэтому вектор выполнит реаллокацию: выделит новый буфер (обычно большей ёмкости, например 444), скопирует/переместит элементы и освободит старый. При реаллокации все указатели/ссылки/итераторы на элементы инвалидируются. - Следовательно `p` становится висячим указателем, а `std::cout << *p;` — неопределённое поведение (может печатать что угодно или привести к краху). Как сделать корректно: заранее `v.reserve(333)`, или после пушей заново получить `p = v.data()`, либо использовать индекс `v[0]` непосредственно, не сохраняя старый указатель.
Почему:
- После `v.reserve(222)` ёмкость вектора не меньше 222.
- Два вызова `v.push_back(111)` и `v.push_back(222)` дают `size() == 222` и `capacity() >= 222`.
- `int* p = &v[0];` даёт указатель на элемент в внутреннем массиве.
- Следующий `v.push_back(333)` превышает текущую ёмкость 222, поэтому вектор выполнит реаллокацию: выделит новый буфер (обычно большей ёмкости, например 444), скопирует/переместит элементы и освободит старый. При реаллокации все указатели/ссылки/итераторы на элементы инвалидируются.
- Следовательно `p` становится висячим указателем, а `std::cout << *p;` — неопределённое поведение (может печатать что угодно или привести к краху).
Как сделать корректно: заранее `v.reserve(333)`, или после пушей заново получить `p = v.data()`, либо использовать индекс `v[0]` непосредственно, не сохраняя старый указатель.