C++ siZeOf(数组)返回数组声明长度的两倍

C++ siZeOf(数组)返回数组声明长度的两倍,c++,sizeof,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

我有一段代码,其中声明了大小为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);
}

sizeof运算符以单位度量,因此无符号字符为1个单位

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

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

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

sizeof运算符以单位度量,因此无符号字符为1个单位

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

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

#define ARRAY_LEN(ary) (sizeof (ary) / sizeof (ary[0]))
sizeof返回变量的大小(在本例中为数组),其中sizeofchar为1。由于char的宽度为一个字节,因此sizeof以字节为单位返回变量的大小。由于系统上的每个短int都有两个字节宽,因此其中6个的数组大小为12,13个的数组大小为26。

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

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

sizeof(races) / sizeof(races[0])
小心这个。它只适用于编译时已知大小的数组。这是行不通的:

void func(short int array[])
{
    // DOES NOT WORK
    size_t size = sizeof(array) / sizeof(array[0]);
}
这里的数组实际上是一个短int*,sizeofarray不返回数组的实际大小,这在编译时是未知的

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

这是C++中首选或原始数组的一个原因。

siZeof返回字节大小,对于数组来说,阿纳尔是每个条目的项数。将项目数除以一个元素的大小

sizeof(races) / sizeof(races[0])
小心这个。它只适用于编译时已知大小的数组。这是行不通的:

void func(short int array[])
{
    // DOES NOT WORK
    size_t size = sizeof(array) / sizeof(array[0]);
}
这里的数组实际上是一个短int*,sizeofarray不返回数组的实际大小,这在编译时是未知的

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

这是C++中首选或原始数组的一个原因。

siZeof返回数组中使用的字节的实际内存。一个相当常见的习语是这样做:

short int races[6] = {DWARF,ELF,GNOME,HALFELF,HALFLING,HUMAN};
size_t num_races = sizeof(races) / sizeof(races[0]);
num_races会将数组中的元素数存储在其中。

sizeof返回数组使用的实际内存(以字节为单位)。一个相当常见的习语是这样做:

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

NuxMySraces将有数组中的元素数。<> p> siZeof是C++中的一个操作符,它测量字节数的大小。我认为在你的机器整型中需要2字节,这就是为什么它显示数组的双倍大小。

siZof是C++中的一个操作符,它测量字节数的大小。您的计算机整数需要2个字节,这就是为什么它显示数组大小的两倍。

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

double array[10]; // type of array is: double[10]
sizeofarray与sizeofdouble[10]的含义相同,等于:

sizeof(double) * 10
它是一个可以容纳10个双倍值的数组。sizeofarray[0]的意思是:数组中单个元素的大小,与此处的sizeofdouble相同。要获得元素的实际数量,必须将数组的大小除以单个元素的大小:

size_t num_elem = sizeof(array) / sizeof(array[0]);
但是,这对指针不起作用

double* p = array;
sizeofp实际上转换为sizeofdouble*。它的大小与double的大小或它指向的数组的大小无关。 相反,它是将地址存储到32位操作系统上32位内存位置所需的大小。有关元素数量的信息丢失

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

template<typename T, size_t N>
size_t inline static_arrlen(T (&)[N]) {
    return N;
}
如果试图从指针获取数组大小,它将不会编译:

static_arrlen(p); // ERROR: could not deduce template argument 
                  // for 'T (&)[N]' from 'double *'
sizeof运算符返回编译时表示类型所需的大小(字节)

double array[10]; // type of array is: double[10]
sizeofarray与sizeofdouble[10]的含义相同,等于:

sizeof(double) * 10
它是一个可以容纳10个双倍值的数组。sizeofarray[0]的意思是:数组中单个元素的大小,与此处的sizeofdouble相同。要获得元素的实际数量,必须将数组的大小除以单个元素的大小:

size_t num_elem = sizeof(array) / sizeof(array[0]);
但是,这对指针不起作用

double* p = array;
sizeofp实际上转换为sizeofdouble*。它的大小与double的大小或它指向的数组的大小无关。 相反,它是将地址存储到32位操作系统上32位内存位置所需的大小。有关元素数量的信息丢失

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

template<typename T, size_t N>
size_t inline static_arrlen(T (&)[N]) {
    return N;
}
如果您试图获取数组大小fr 如果是指针,它将不会编译:

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


在什么情况下会用到这个?如果您正在分配一个非固定大小的数组,您将知道或在某个时候计算成员的数量。更好的是,你可以使用一个向量。@slavik262如果你在某处有一个常量数组,这种代码可以使你不必分别更新数组和项目数。你也可以使用std::数组。@slavik262是的,你知道大小。但是,如果没有除法,当某些内容发生变化时,您必须记住同时更新数组和大小字段。@slavik262 OP可以省略显式的6和13,并且此技巧仍然有效。在什么情况下会使用此方法?如果您正在分配一个非固定大小的数组,您将知道或在某个时候计算成员的数量。更好的是,你可以使用一个向量。@slavik262如果你在某处有一个常量数组,这种代码可以使你不必分别更新数组和项目数。你也可以使用std::数组。@slavik262是的,你知道大小。但是,如果没有除法,您必须记住在发生变化时同时更新数组和大小字段。@slavik262 OP可以省略显式的6和13,这个技巧仍然有效。是的,虽然在本例中,当无符号字符的长度为8位时,字节仅表示8位。@slavik262在C中,所有内容都是根据sizeofchar定义的,即定义1。如果字符大于1字节,您将有一个平台,其中没有足够小的类型来表示1字节。这是合法的,但很奇怪。无符号字符中的位数由limits.h中的char_位指定。sizeof unsigned char的计算值始终为1。@slavik262,John Kugelman:sizeofchar在§5.3.3中定义为1。在C++11§1.7中,一个字节至少有8位宽。@JohnKugelman,这是不合法的;正如DyP所说,C++定义了siZOF,以将字节大小和C++的大小定义为1。当然,C++所定义的字节可能不是字节,因为给定平台的硬件工程师会想到它。虽然在这种情况下,字节仅在无符号字符为8位长的情况下才是8位。@ C中的SLVIK262是以sisioFchar定义的,这是定义1。如果字符大于1字节,您将有一个平台,其中没有足够小的类型来表示1字节。这是合法的,但很奇怪。无符号字符中的位数由limits.h中的char_位指定。sizeof unsigned char的计算值始终为1。@slavik262,John Kugelman:sizeofchar在§5.3.3中定义为1。在C++11§1.7中,一个字节至少有8位宽。@JohnKugelman,这是不合法的;正如DyP所说,C++定义了siZOF,以将字节大小和C++的大小定义为1。当然,C++所定义的字节可能不是字节,因为给定平台的硬件工程师会想到它。在您使用下面的每个人的建议之后,使用SiZeFaRayay-Va/ SsiZoFaRayay-Var(0)。请记住,当您用指针变量替换数组变量时,它不起作用。如果这听起来让您感到困惑,我建议您阅读更多关于数组、指针以及它们之间的区别的内容。看看您在做什么:您声明了两个数组,一个包含6项,另一个包含13项。然后对这些数组调用sizeof,可以预见,它返回数组中的元素数乘以每个元素的大小。由于您将数组声明为short int,在您的平台上,每个数组的长度为16位或2字节,因此编译器将正确地为种族和类分别返回12或2*6和26或2*13字节。在您听取下面所有人的建议并使用sizeofarray_var/sizeofarray_var[0]之后请记住,当您用指针变量替换数组变量时,它不起作用。如果这听起来让您感到困惑,我建议您阅读更多关于数组、指针以及它们之间的区别的内容。看看您在做什么:您声明了两个数组,一个包含6项,另一个包含13项。然后对这些数组调用sizeof,可以预见,它返回数组中的元素数乘以每个元素的大小。由于您将数组声明为short int,在您的平台上,每个数组的长度为16位或2字节,因此编译器将正确地为种族和类分别返回12或2*6和26或2*13字节。它显示为2x,因为他使用的是无符号短整数数组,在他的平台上,这些整数的宽度为16位。他的平台上的机器整数可能是32位。它显示2x,因为他使用的是无符号短整数数组,在他的平台上是16位宽。他平台上的机器整数可能是32位。