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

sizeof(*p) are my results undefined?

在此代码中,我取消引用了一个未初始化的元素。我的结果是否未定义?

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

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

是完全合法的,但不是完全有效的代码。 sizeof 在编译时计算。如果它们不能在编译时被评估,你会得到编译器错误。

意料之中的惊喜。你不会得到 10。要获得 10,您需要使用:

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

在 C++ 中,表达式 "*p" 和 "p[0]" 的计算方式相同,因此:

*p == p[0]

计算结果为真。我不知道你所说的 "an element that doesn't exist".

是什么意思

我认为您的代码没有按照您的想法行事。行

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

将计算 sizeof(p),它是 int* 类型,给出类似 4 的值,计算 sizeof(*p),它是 int 类型,并给出类似 4 的值,然后将它们相除得到1.

此代码完全有效,但由于大多数常见系统对整数和指针都使用 4 个字节,因此您很可能每次都会打印出“1”。

如果您改写:

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

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

你会得到 "sizeof(int[10]) / sizeof(int)",它等于 10。这是因为 x 的类型不是 int*,而是 int[10],或 "an array of 10 ints".

正如 R Sahu 所回答的那样,sizeof() 在编译时计算,因此如果它无法确定大小,您的代码将无法编译。