cppreference имеет эту заметку для std::vector::data
:
Возвращает указатель на базовый массив, служащий в качестве хранилища элементов. Указатель таков, что диапазон
[data(); data() + size())
всегда является допустимым диапазоном, даже если контейнер пуст.
Что здесь означает "действительный диапазон"? Что вернет data()
, если вектор имеет нулевую длину?
В частности, для вектора нулевой длины:
- Может ли
data()
быть нулевым указателем? - Можно ли безопасно разыменовать? (Даже если это указывает на хлам.)
- Гарантируется ли разница между двумя разными (нулевыми) векторами?
Я работаю с библиотекой C, которая берет массивы и не допускает нулевой указатель даже для массива нулевой длины. Однако на самом деле он не разыскивает указатель хранения массива, если длина массива равна нулю, он просто проверяет, является ли это NULL
. Я хочу убедиться, что я могу безопасно передать data()
в эту библиотеку C, поэтому единственным актуальным вопросом является (1) выше. (2) и (3) просто из любопытства в случае возникновения подобной ситуации.
Обновление
На основе комментариев, которые не были переданы в ответы, мы можем попробовать следующую программу:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v;
cout << v.data() << endl;
v.push_back(1);
cout << v.data() << endl;
v.pop_back();
cout << v.data() << endl;
v.shrink_to_fit();
cout << v.data() << endl;
return 0;
}
С моим компилятором он выводит:
0x0
0x7f896b403300
0x7f896b403300
0x0
Это показывает, что:
-
data()
действительно может быть нулевым указателем, поэтому ответы: (1) yes (2) no (3) no -
но он не всегда является нулевым указателем для вектора нулевого размера
Да, очевидно, я должен был попробовать это, прежде чем спрашивать.