今回は、C言語のsizeof 演算子を使用して配列の要素数を取得する方法を紹介します。
さらに、sizeof 演算子の他の使用方法についても紹介しようと思います。
sizeof 演算子とは
まずはじめにsizeof 演算子とはなにか紹介します。
sizeof 演算子とは、変数やデータ型の使用メモリサイズを算出するものです。
算出対象を()でくくって使用します。
sizeof(変数名);
sizeof 演算子の使用例
では実際に、sizeof 演算子の使い方をみていきましょう。
今回は、3つの使い方について紹介します。
- 型のメモリサイズ
- 配列の要素
- 文字列の文字数
sizeof 演算子で型のメモリサイズを調べる
まずは型のメモリサイズを調べる方法です。
#include<stdio.h>
int main(void){
printf("char メモリサイズ: %d\n", sizeof(char));
printf("int メモリサイズ: %d\n", sizeof(int));
printf("short メモリサイズ: %d\n", sizeof(short));
printf("long メモリサイズ: %d\n", sizeof(long));
return 0;
}
実行結果
char メモリサイズ: 1
int メモリサイズ: 4
short メモリサイズ: 2
long メモリサイズ: 8
sizeof 演算子の()に型名を入れるだけで、簡単に型のメモリサイズを調べることが可能です。
sizeof 演算子で配列の要素数を調べる
次に、sizeof 演算子を使用して、配列の要素数を調べる方法です。
配列の要素数は、「配列のメモリサイズ」と「配列の要素一つのメモリサイズ」から調べることができます。
ちょっと難しい言い方をしていますが、実際の実装をみれば、何を言っているかわかると思います。
#include<stdio.h>
int main(void){
int num_list[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
printf("配列全体のメモリサイズ: %d\n", sizeof(num_list));
printf("配列ひと要素のメモリサイズ: %d\n", sizeof(num_list[0]));
printf("配列の要素数: %d\n", sizeof(num_list) / sizeof(num_list[0]));
return 0;
}
実行結果
配列全体のメモリサイズ: 40
配列ひと要素のメモリサイズ: 4
配列の要素数: 10
配列全体のメモリサイズを sizeof(num_list)で取得し、
sizeof(num_list[0])で配列ひと要素のメモリサイズ(0番目のメモリサイズ)を取得しています。
そして、配列全体のメモリサイズ sizeof(num_list) から
配列ひと要素のメモリサイズ sizeof(num_list[0]) を割ることで、
配列の要素数を取得できます。
sizeof 演算子で文字列の文字数を調べる
次に紹介するのは、sizeof 演算子を使用して、文字列の文字数を調べる方法です。
ただし、1点注意点があります。
取得する文字数にNULL文字が含まれる(1文字多く取得してしまう)
そのため、sizeof 演算子で文字数を取得した場合は、1文字分マイナスする必要があります。
実際には以下のように使用します。
#include<stdio.h>
int main(void){
char moji[] = "mojisize";
printf("NULL文字を含む文字サイズ: %d\n", sizeof(moji));
printf("実際の文字サイズ: %d\n", sizeof(moji) - 1);
return 0;
}
実行結果
NULL文字を含む文字サイズ: 9
実際の文字サイズ: 8
sizeof 演算子で文字列 “mojisize” (8文字)の文字数を取得してみました。
sizeof(moji)で文字列の文字数を取得すると、1文字多い、9 が出力されます。
sizeof(moji) – 1 で 正しい文字数 8を出力できます。
開発現場で実際によく使用する方法
実際の開発現場でsizeof演算子をよく使用する方法について紹介します。
sizeof 演算子と memcpy 関数
sizeof 演算子は、memcpy 関数と合わせてよく使用します。
memcpy 関数とは指定のメモリサイズ分をコピーする関数です。
どういうときにこの2つをあわせて使用するかというと、
メモリから配列にデータを格納するときに使用します。
コピーするサイズ数をsizeof 演算子で取得しています。
#include<stdio.h>
#include<string.h>
int main(void){
char moji[] = "mojisize";
char moji2[] = "mojimojisize";
printf("文字列 moji2: %s\n", moji2);
memcpy(moji2, moji, sizeof(moji));
printf("文字列 moji2: %s\n", moji2);
return 0;
}
実行結果
文字列 moji2: mojimojisize
文字列 moji2: mojisize
文字列 moji の”mojisize” が文字列 moji2にコピーされていることがわかると思います。
sizeof 演算子で文字列 moji のサイズ数だけコピーしています。
まとめ
size of演算子は、開発現場でもよく見かけます。使い方をマスターしましょう!