我试图在c ++中使用sizeof运算符做一些事情 请参阅以下代码段 http://ideone.com//HgGYB
#include <iostream>
using namespace std;
int main()
{
int *pint = new int[5];
int temp = sizeof(*pint);
cout << "Size of the int array is " << temp << endl;
return 0;
}
我期待输出为5 * 4 = 20.令人惊讶的是它来到4.任何想法?
答案 0 :(得分:6)
以下pint
是int*
。所以,
sizeof(*pint) == sizeof(int)
编译器不知道new int[5]
的时间sizeof(*pint)
(因为sizeof()
是编译时运算符)。
[注意:使用静态声明的数组int pint[5];
尝试相同的测试,并会看到预期的结果。
此外,sizeof()
返回size_t
(这是一个无符号值),因此应该是:
size_t temp = sizeof(...);
答案 1 :(得分:1)
动态大小的数组会丢失其大小信息 - 大小只是一个整数的大小,因为pint
是指向int的指针,*pint
是整数,而不是任何大小的数组类型
答案 2 :(得分:1)
C ++无法知道数组的大小。 在你的情况下,
*pint
返回一个int,并且你的机器上的sizeof(int)为4。
答案 3 :(得分:0)
一切都很好。你要求int
的大小为4个字节。
答案 4 :(得分:0)
pint是指向int的指针,恰好指向数组的开头。它不包含有关此数组的信息。
答案 5 :(得分:0)
它给出了指针指向的大小 - 数组中的第一个位置。
答案 6 :(得分:0)
在当前情况下,sizeof(* pint)给出sizeof(int),因此返回4。但是,即使您将尝试sizeof(品脱),它也会返回指针的大小。如果你的是32位机器,那么最有可能是4,如果是64位机器,那么它将是8。
现在你问了,为什么它没有返回4 * 5 = 20.因为pint指向一个整数数组。是的,pint指向一个整数数组,但它不是一个数组。区别在于:
由于sizeof运算符是在编译时计算的,因此编译器无法知道此指针指向的数组大小,因此无法告诉该对象的大小,因此它始终只返回指针的大小。现在你可以理解,为什么在指针编译器的情况下给出指针的大小(即指针在内存中占用的空间),但是在数组的情况下它给出了完整的大小。