我有一段代码,其中声明了两个数组,大小为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);
}
答案 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::vector
或std::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 *'