1

我有一段代码,其中声明了两个数组,大小分别为 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);
}
4

6 回答 6

10

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

于 2012-11-02T18:28:54.493 回答
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)不返回数组的实际大小,这在编译时是未知的。

std::vector这是在 C++中偏爱std::array原始数组的众多原因之一。

于 2012-11-02T18:29:12.117 回答
1

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

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

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

于 2012-11-02T18:30:07.410 回答
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 *'
于 2012-11-02T20:54:15.100 回答
0

sizeof 运算符以单位进行测量,使得 unsigned char 为 1 个单位。

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

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

#define ARRAY_LEN(ary) (sizeof (ary) / sizeof (ary[0]))
于 2012-11-02T18:28:33.373 回答
0

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

于 2012-11-02T18:31:36.477 回答