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 ?
答案 0 :(得分:5)
因为根本不起作用。
它仅适用于以这种方式声明的普通旧数组:
string a[10];
这是这项工作的唯一案例。
在您的情况下,您无法从指针中检索大小。你必须存储你拥有的大小,或者只使用所有拥有.size()成员的STL容器。后者是可取的。
答案 1 :(得分:3)
因为sizeof
是编译时计算,而不是运行时计算。并且直到运行时才能知道您的数组大小。
sizeof
不知道指针指向到的位置,所以分配的缓冲区有多大,甚至根本没有分配缓冲区也没关系。你甚至可以这样做:
data = NULL;
x = sizeof(*data);
因为它是在编译时计算的,所以没有空指针解除引用。
sizeof
只会查看您传入的数据类型,而不是数据本身。在这种情况下,string*
,无论指向何处,都是相同的大小。
您可以选择使其“正常工作”:
string data[50];
),您可以使用sizeof
成语,但当然您会获得静态数组的所有标准限制。new
动态分配,但只需存储数组大小并将其传递到您需要的任何位置。std::vector
- 这基本上是所有世界中最好的。答案 2 :(得分:2)
什么是sizeof data
?它的大小为string*
。什么是sizeof *data
?它是data
指向的大小,即string
的大小。这两个都是不变的。
data
对你分配了多少元素没有任何了解 - 它只是一个愚蠢的指针。
您必须记住,sizeof
始终在编译时进行评估。因此,您永远无法获得sizeof
有关运行时发生的事情的信息,例如new
来电。