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() 在编译时计算,因此如果它无法确定大小,您的代码将无法编译。
在此代码中,我取消引用了一个未初始化的元素。我的结果是否未定义?
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() 在编译时计算,因此如果它无法确定大小,您的代码将无法编译。