sizeof(* p)是我的结果未定义?

时间:2016-02-17 19:03:05

标签: c++ pointers sizeof dereference

在此代码中,我解除引用未初始化的元素。我的结果未定义吗?

int x[10];
int *p = x;

cout << sizeof(p) / sizeof(*p) << endl;

2 个答案:

答案 0 :(得分:5)

cout << sizeof(p) / sizeof(*p) << endl;

是完全合法的,但不完全有效的代码。 sizeof在编译时进行评估。如果在编译时无法对它们进行求值,则会出现编译错误。

令人意外的是预期的结果。你不会得到10。要获得10,您需要使用:

cout << sizeof(x) / sizeof(x[0]) << endl;

答案 1 :(得分:1)

在c ++中,表达式&#34; * p&#34;和&#34; p [0]&#34;以同样的方式评估,所以:

*p == p[0]

会评估为真。我不知道你的意思&#34;一个不存在的元素&#34;。

我不认为你的代码符合你的想法。这条线

cout << sizeof(p) / sizeof(*p) << endl;

将评估sizeof(p),其类型为int *,并给出类似于4的值,求值sizeof(* p),其类型为int,并给出类似于4的值,然后将它们除以得到1。

这段代码完全有效,但由于大多数常见系统都使用4个字节作为整数和指针,因此很可能会打印掉#34; 1&#34;每一次。

如果您改为写道:

cout << sizeof(x) / sizeof(*x) << endl;

cout << sizeof(x) / sizeof(x[0]) << endl;

你会得到&#34; sizeof(int [10])/ sizeof(int)&#34;,等于10.这是因为 x 的类型不是int *,但是int [10],或者#34;一个10个整数的数组&#34;。

正如R Sahu所回答的那样,sizeof()在编译时进行评估,所以如果它无法计算出大小,那么你的代码将无法编译。