Поскольку sizeof
- это расчет во время компиляции, а не во время выполнения.А размер вашего массива неизвестен до времени выполнения.
sizeof
ничего не знает о том, куда указывает указатель на , поэтому не имеет значения, какой размер буфера вы используетевыделенный, или даже то, что вы выделили буфер вообще.Вы даже можете сделать:
data = NULL;
x = sizeof(*data);
Поскольку он рассчитывается во время компиляции, разыменование нулевого указателя не выполняется.
sizeof
смотрит только на тип данных Вы передаете, а не сами данные.В данном случае, string*
, который имеет одинаковый размер, независимо от того, на что он указывает.
У вас есть несколько вариантов, чтобы эта «работа»:
- Использовать статическиразмерного массива (например,
string data[50];
), где вы можете использовать идиому sizeof
, но, конечно, тогда вы получите все стандартные ограничения статических массивов. - Продолжайте динамически выделять, используя
new
, носохраняйте размер массива и передавайте его туда, куда вам нужно. - Предпочтение: Использование
std::vector
для массивов - это в основном лучший из всех миров.