【C言語入門】sizeof演算子の使い方(配列の要素数、構造体のサイズ)

みなさんは、sizeof演算子をご存知でしょうか?

他の言語ではほとんどの場合、配列の要素数を求めるためのマクロやメソッドが用意されています。

ですが、残念ながらC言語にはありません。C言語ではsizeof演算子を使って、配列の要素数を求めます。sizeof演算子はその他にも、構造体のサイズやポインタのサイズを取得するために使われます。

この記事では、sizeof演算子について

  • sizeof演算子とは
  • 配列の要素数を取得する
  • ポインタのサイズを取得する

という基本的な内容から、関数に配列を渡す時の注意点や、文字列長と配列サイズの使い分けといった応用的な内容についても解説していきます。

sizeof演算子とは

sizeof演算子とは、変数や型のメモリサイズを調べるための演算子です。sizeof演算子は、変数や型のメモリサイズをバイト単位で返してくれます。メモリサイズとはコンピュータが使用するメモリの大きさのことです。

配列の要素数を取得する

配列の要素数は

  • sizeof演算子を用いて配列全体のメモリサイズを求める
  • 全体のメモリサイズを配列の要素一つ分のメモリサイズで割る

という2ステップで簡単に求められます。サンプルコードは以下の通りです。

実行結果:

sizeof演算子がバイト単位でメモリサイズを求めてくれるので、

配列の要素数(arrayNumber) =
配列の要素全体の大きさ(sizeof array) / 配列の要素一つ分の大きさ(sizeof array[0])

という簡単な割り算の式で配列の要素数を求めることができます。

ポインタのサイズを取得する

sizeof演算子を使ってポインタのバイト数を取得する場合は注意が必要です。サンプルコードでみていきましょう。

実行結果:

このサンプルコードでは、文字列のポインタstrのバイト数をsizeof演算子を使って取得しています。

ポインタstrには文字列リテラル”Hello World!”が格納されていますので、文字列のバイト数の12が出力されると勘違いしがちですが、ポインタのバイト数は8と出力表示されています。

sizeof演算子で取得した値はあくまでポインタのバイト数で、格納されているデータのバイト数ではないので注意しましょう!

関数に配列を渡すときの注意点

ここまでで、sizeof演算子を使って、配列の要素数を求める方法はわかりました。ですが、ここで一つ注意して欲しいことがあります。それは配列がポインタの値に置き換えられていた場合です。

C言語では、配列を別の関数に引数として渡す場合、処理を軽くするために配列の中身をそのまま渡すのではなくて、配列の先頭のポインタの値を渡します。

引数として別の関数で用いられた場合、sizeof演算子で計算できるのはポインタのメモリサイズであって、元の配列のメモリサイズではありません。つまり、別の関数内では要素数を求めることができなくなってしまうのです。

なので、配列の値を別の関数に渡す場合は上記の方法を使って、あらかじめ配列の要素の数を求めておき、配列の値と同時に配列の要素数も引数として渡します。では、比べる方法をサンプルコードで確認してみましょう。

実行結果:

このように、本来配列の要素数は10ですが、同様の方法で配列の要素数を求めると別の関数内では2になってしまいます。なので、別の関数で正しく配列の要素数を求めるためには、あらかじめ求めた配列の要素数を引数として渡してあげる必要があります。

配列の要素数を引数として渡す方法をサンプルコードで確認してみましょう。

実行結果:

引数に配列の要素数の値をそのまま渡したので、同じ値になります。これで、別の関数に渡した後でも配列の要素数を問題なく扱えます。

文字列長と配列サイズの使い分け

文字配列を宣言・定義し、その文字列長を取得する場合はsizeof演算子を使って配列サイズを求める場合と使い分ける必要があります。

文字列長を取得する方法として、strlen関数を使う方法があります。strlen関数を使うには「string.h」をインクルードする必要があります。strlen関数とsizeof演算子を使った場合とサンプルコードで比較してみましょう。

このサンプルコードでは、文字列strの文字列長をstrlen関数で、バイト数をsizeof演算子で取得しています。sizeof演算子で取得した結果は1文字分多くなっています。

C言語では文字列の終端に”\0″が付けられていて、それまで含めたバイト数をsizeof演算子では取得するためです。なお、日本語のようなマルチバイトの文字列は文字列長と文字数が異なりますので、注意しましょう。

参考までにmblen関数を使ったマルチバイト文字列の文字数を取得する方法も記述しています。mblen関数を使うには、setlocale関数でロケールを設定する必要があります。

mblen関数を使うには「stdlib.h」をインクルードする必要があり、setlocale関数を使うには「locale.h」をインクルードする必要があります。

サンプルコードではLinux環境でコンパイル、実行しています。他のコンパイラーなど環境が異なる場合は、エラーが発生するかもしれませんので、ご注意ください。

配列の使い方総まとめ

この記事では紹介しきれなかった配列のいろいろな使い方を次の記事にまとめているので、ぜひ確認してください!

【C言語入門】配列とは?配列の使い方総まとめ
更新日 : 2018年11月27日

まとめ

いかがでしたか。この記事では、sizeof演算子を使って配列の要素数を求める方法を解説しました。実際のプログラミングでは、たとえばfor文の繰り返し回数を決めるのに配列の要素数は使われます。

また、配列を扱う上では、必ず配列の要素数を必要とする場面に遭遇します。C言語はC++やJavaなど、数多くの言語に影響を与えた言語です。C言語を学べば、他の言語を学ぶ基礎が身につくこと間違いなしでしょう。

LINEで送る
Pocket

最短でエンジニアを目指すなら侍エンジニア塾

cta_under_bnr

侍エンジニア塾は業界で初めてマンツーマンレッスンを始めたプログラミングスクールです。これまでの指導実績は16,000名を超え、未経験から数多くのエンジニアを輩出しています。

あなたの目的に合わせてカリキュラムを作成し、現役エンジニア講師が専属であなたの学習をサポートするため効率よく学習を進めることができますよ。

無理な勧誘などは一切ありません。まずは無料体験レッスンを受講ください。

無料体験レッスンの詳細はこちら

書いた人

長瀬来

長瀬来

Unityを使ったiOSアプリのリリース、フリマサイト運営の経験があります。

経験した言語はC、C#、Javascript、R、Python、Ruby、PHPなど

言語が好きで、英語や中国、ドイツ語を勉強しました。
将来的には海外で生活したいです。

現在はRuby on Rails5やCocos2dxの勉強を主にしています。

ライターとしては
できるだけ初心者にわかりやすい文章になるように心がけています。

趣味は語学、読書です。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説