「sizeof」の版間の差分

提供: C++入門
移動: 案内検索
(ページの作成:「sizeof とは、データ型のサイズ(バイト)を求める単項演算子です。sizeofは、原則、コンパイル時に計算されます。 '''読...」)
 
(相違点なし)

2013年11月2日 (土) 11:12時点における最新版

sizeof とは、データ型のサイズ(バイト)を求める単項演算子です。sizeofは、原則、コンパイル時に計算されます。

読み方

sizeof
さいずおぶ

概要

sizeofは、newやmallocなどでメモリを確保するときやファイルやソケットに書き込み(write)や読み込み(read)するときなどに使われます。

配列の大きさを調べる

配列のサイズを調べるサンプルコードです。

#include <iostream>
using namespace std;
int main(int argc, char const* argv[])
{
        int i = 0;
        int a[3] = {0};
        char str[] = "hoge";
        cout << "i = " << sizeof (i) << endl;
        cout << "a[] = " << sizeof (a) << endl;
        cout << "str = " << sizeof (str) << endl;
        return 0;
}

この実行環境では、int が 4byteであるため、int a[3] は、4byte x 3 = 12byte になります。 str が 5 なのは、NULLターミネートのNULL文字の分があるからです。

% g++ sizeof.cpp
% ./a.out
i = 4
a[] = 12
str = 5

配列の要素数を調べる

配列の要素数をsizeofで調べられます。

これは、正しい例です。

int a[] = {1,2,3};
unsigned int size = sizeof(a)/sizeof(int)
// or: unsigned int size = sizeof(a)/sizeof(a[0])

これは、要素数ではありません。これは、大きさです。

int a[] = {1,2,3};
unsigned int size = sizeof(a); // これは、要素数ではなく、大きさになります。

warning: comparison between signed and unsigned integer expressions

#include <iostream>
using namespace std;
 
int main(int argc, char const* argv[])
{
        int a[] = {1,2,3};
        for (int i = 0; i < (sizeof(a)/sizeof(int)) ; i++) {
                cout << a[i] << endl;
        }
        return 0;
}

上記のコードをコンパイルすると下記の警告が出ます。

% g++ for.cpp
for.cpp: In function 'int main(int, const char**)':
for.cpp:7: warning: comparison between signed and unsigned integer expressions

問題になっているのは、 sizeof () と int 型を比較している箇所です。 sizeof()が unsigned int であるのに対して、比較対象が int (signed int) です。

for (int i = 0; i < (sizeof(a)/sizeof(int)) ; i++) {
}

これを解決するには、 int を unsigned int にします。

for (unsigned int i = 0; i < (sizeof(a)/sizeof(int)) ; i++) {
}

g++ の -Wno-sign-compare オプションを使うと警告がでなくなりますが、そうするべきではありません。

g++ -Wno-sign-compare foo.cpp

関連項目