在此代码中,我解除引用未初始化的元素。我的结果未定义吗?
int x[10];
int *p = x;
cout << sizeof(p) / sizeof(*p) << endl;
答案 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()在编译时进行评估,所以如果它无法计算出大小,那么你的代码将无法编译。