1

2つの配列が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ですchar。aは1バイト幅でsizeofあるため、変数のサイズをバイト単位で返します。システムではそれぞれshort intが2バイト幅であるため、そのうちの6つの配列のサイズは12になり、13の配列のサイズは26になります。

于 2012-11-02T18:28:54.493 に答える
6

sizeofサイズをバイト単位で返します。これは、配列の場合、アイテムの数×各アイテムのサイズです。アイテムの数を1つの要素のサイズで割った値を取得します。

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

これに注意してください。これは、コンパイル時にサイズがわかっている配列に対してのみ機能します。これは機能しません:

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

これarrayは実際にはashort int *でありsizeof(array)、コンパイル時に不明な配列の実際のサイズを返しません。

これは、C++のraw配列を好むstd::vectorまたは好む多くの理由の1つです。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は、unsignedcharが1単位になるように単位で測定されます。

プラットフォームでは、shortはcharの2倍の大きさであるため、表示される結果が得られます。

配列の長さを適切に決定するには、次のようなマクロを使用できます。

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

sizeofは、バイト数でサイズを測定するC ++の演算子です。マシンでは整数が2バイトかかると思います。そのため、配列の2倍のサイズが表示されます。

于 2012-11-02T18:31:36.477 に答える
0

演算子は、タイプを表すために必要なサイズをバイト単位で返します(sizeofコンパイル時)。

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

sizeof(array)と同じ意味を持ち、次のsizeof(double[10])ようになります。

sizeof(double) * 10

これは、10個のdouble値を保持できる配列です。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 に答える