c ++ sizeof(array)返回数组声明长度的两倍

时间:2012-11-02 18:27:22

标签: c++ sizeof

我有一段代码,其中声明了两个数组,大小为6和13,但是当使用'sizeof()'时,长度返回为12和26。

#include <iostream>
using namespace std;

int main(){

    enum charRaces {DWARF,ELF,GNOME,HALFELF,HALFLING,HUMAN};
    enum classes{WARRIOR,FIGHTER,RANGER,PALADIN,WIZARD,MAGE,ILLUSIONIST,PRIEST,CLERIC,DRUID,ROGUE,THEIF,BARD};

    short int races[6] = {DWARF,ELF,GNOME,HALFELF,HALFLING,HUMAN};
    short int classes[13] = {WARRIOR,FIGHTER,RANGER,PALADIN,WIZARD,MAGE,ILLUSIONIST,PRIEST,CLERIC,DRUID,ROGUE,THEIF,BARD};

    cout << "sizeof(races)\t"  << sizeof(races) << endl;
    cout << "sizeof(classes)\t"  << sizeof(classes) << endl;

    system("pause");

    return(0);
}

6 个答案:

答案 0 :(得分:10)

sizeof返回变量的大小(在本例中为数组),其中sizeof(char)为1.由于char是一个字节宽,sizeof返回变量的大小(以字节为单位)。由于系统中每个short int宽度为两个字节,因此其中6个数组的大小为12,而13个数组的大小为26。

答案 1 :(得分:6)

sizeof返回以字节为单位的大小,对于数组,它是项目数×每个项目的大小。获取项目数除以一个元素的大小。

sizeof(races) / sizeof(races[0])

小心这一点。它仅适用于编译时已知大小的数组。这不起作用:

void func(short int array[])
{
    // DOES NOT WORK
    size_t size = sizeof(array) / sizeof(array[0]);
}

此处array实际上是short int *sizeof(array)不返回数组的实际大小,这在编译时是未知的。

这是在C ++中首选std::vectorstd::array原始数组的众多原因之一。

答案 2 :(得分:1)

sizeof返回数组使用的实际内存(以字节为单位)。一个相当普遍的习惯是做这样的事情:

short int races[6] = {DWARF,ELF,GNOME,HALFELF,HALFLING,HUMAN};
size_t num_races = sizeof(races) / sizeof(races[0]);
然后

num_races会将数组中的元素数存储在其中。

答案 3 :(得分:0)

sizeof运算符以单位计量,使得无符号字符为1个单位。

在你的平台上,short是char的两倍,因此就是你看到的结果。

要正确确定数组长度,可以使用宏,例如:

#define ARRAY_LEN(ary) (sizeof (ary) / sizeof (ary[0]))

答案 4 :(得分:0)

sizeof是C ++中的一个运算符,用于测量字节数的大小。我认为在你的机器中整数需要2个字节,这就是为什么它显示的是数组大小的两倍。

答案 5 :(得分:0)

sizeof运算符返回表示类型所需的字节大小(在编译时)。

double array[10]; // type of array is: double[10]

sizeof(array)sizeof(double[10])具有相同的含义,它等于:

sizeof(double) * 10

这是一个可以容纳10个双精度值的数组。 sizeof(array[0])表示:数组中单个元素的大小,与此处的sizeof(double)相同。要获得实际的元素数,您必须将数组的大小除以单个元素的大小:

size_t num_elem = sizeof(array) / sizeof(array[0]);

但是,这对指针不起作用!

double* p = array;

sizeof(p)实际上转换为sizeof(double*)。它的大小与double的大小或它所指向的数组的大小无关。 相反,它是将地址存储到存储器位置所需的大小(32位操作时为32位)。关于元素数量的信息丢失了!

如果要安全地获取数组中的元素数,可以使用此模板:

template<typename T, size_t N>
size_t inline static_arrlen(T (&)[N]) {
    return N;
}

在编译时,它推导出类型T和元素数N,返回N。

size_t num_elem = static_arrlen(array); // T=double, N=10

如果你试图从指针获取数组大小,它将无法编译:

static_arrlen(p); // ERROR: could not deduce template argument 
                  // for 'T (&)[N]' from 'double *'