为什么sizeof Variablename / sizeof * VariableName不能按预期工作?

时间:2011-02-10 12:29:33

标签: c++ sizeof

 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 个答案:

答案 0 :(得分:5)

因为根本不起作用。

它仅适用于以这种方式声明的普通旧数组:

 string a[10];

这是这项工作的唯一案例。

在您的情况下,您无法从指针中检索大小。你必须存储你拥有的大小,或者只使用所有拥有.size()成员的STL容器。后者是可取的。

答案 1 :(得分:3)

因为sizeof是编译时计算,而不是运行时计算。并且直到运行时才能知道您的数组大小。

sizeof不知道指针指向的位置,所以分配的缓冲区有多大,甚至根本没有分配缓冲区也没关系。你甚至可以这样做:

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

因为它是在编译时计算的,所以没有空指针解除引用。

sizeof只会查看您传入的数据类型,而不是数据本身。在这种情况下,string*,无论指向何处,都是相同的大小。

您可以选择使其“正常工作”:

  1. 使用静态大小的数组(例如string data[50];),您可以使用sizeof成语,但当然您会获得静态数组的所有标准限制。
  2. 继续使用new动态分配,但只需存储数组大小并将其传递到您需要的任何位置。
  3. 首选:对数组使用std::vector - 这基本上是所有世界中最好的。

答案 2 :(得分:2)

什么是sizeof data?它的大小为string*。什么是sizeof *data?它是data指向的大小,即string的大小。这两个都是不变的。

data对你分配了多少元素没有任何了解 - 它只是一个愚蠢的指针。

您必须记住,sizeof始终在编译时进行评估。因此,您永远无法获得sizeof有关运行时发生的事情的信息,例如new来电。