关于sizeof的疑问

时间:2011-08-11 09:31:57

标签: c++ sizeof

我试图在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.任何想法?

7 个答案:

答案 0 :(得分:6)

以下pintint*。所以,

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指向一个整数数组,但它不是一个数组。区别在于:

  1. 数组具有固定大小。你可以重新发现它。虽然指针可以指向任何大小的任何对象。
  2. 由于sizeof运算符是在编译时计算的,因此编译器无法知道此指针指向的数组大小,因此无法告诉该对象的大小,因此它始终只返回指针的大小。现在你可以理解,为什么在指针编译器的情况下给出指针的大小(即指针在内存中占用的空间),但是在数组的情况下它给出了完整的大小。