Почему sizeof Variablename / sizeof * VariableName не работает должным образом? - PullRequest
2 голосов
/ 10 февраля 2011
 class Simple {
      string *data ;
      //some functions and declaration of some variable,const, dest
 };

Когда я это сделал;

 data = new string [10] ;

 cout << sizeof data / sizeof *data << endl ;

 ==> 1 // output 


 data = new string [50];
 cout <<sizeof data / sizeof *data <<endl ;

==> 1 // output 

**Why** do all output display the same ?

Ответы [ 3 ]

5 голосов
/ 10 февраля 2011

Потому что это просто не работает вообще.

Это работает только для простых старых массивов, которые объявлены следующим образом:

 string a[10];

и это единственный случай, когда эта работа.

в вашем случае вы не можете получить размер из имеющихся у вас указателей. Вы должны либо сохранить размер того, что у вас есть, либо просто использовать контейнеры STL, которые имеют член .size (). Последнее предпочтительнее.

3 голосов
/ 10 февраля 2011

Поскольку sizeof - это расчет во время компиляции, а не во время выполнения.А размер вашего массива неизвестен до времени выполнения.

sizeof ничего не знает о том, куда указывает указатель на , поэтому не имеет значения, какой размер буфера вы используетевыделенный, или даже то, что вы выделили буфер вообще.Вы даже можете сделать:

data = NULL;
x = sizeof(*data);

Поскольку он рассчитывается во время компиляции, разыменование нулевого указателя не выполняется.

sizeof смотрит только на тип данных Вы передаете, а не сами данные.В данном случае, string*, который имеет одинаковый размер, независимо от того, на что он указывает.

У вас есть несколько вариантов, чтобы эта «работа»:

  1. Использовать статическиразмерного массива (например, string data[50];), где вы можете использовать идиому sizeof, но, конечно, тогда вы получите все стандартные ограничения статических массивов.
  2. Продолжайте динамически выделять, используя new, носохраняйте размер массива и передавайте его туда, куда вам нужно.
  3. Предпочтение: Использование std::vector для массивов - это в основном лучший из всех миров.
2 голосов
/ 10 февраля 2011

Что такое sizeof data?Это размер string*.Что такое sizeof *data?Это размер, на который указывает data, то есть размер string.Оба они постоянны.

data не знает, сколько элементов вы выделили - это просто глупый указатель.

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

...