【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言語を学べば、他の言語を学ぶ基礎が身につくこと間違いなしでしょう。

C言語カリキュラム無料公開中!

この記事はC言語入門完全攻略ガイド【基礎学習/応用学習/キャリア形成】の一部になります。このカリキュラムは、プログラミング入門者が、基礎学習から応用学習、さらにはキャリア形成まで体系的に学べる内容となっています。

C言語学習に必要な情報を一つにまとめていますので効率よくC言語を学ぶことが出来ます。この機会に是非活用していただければと思います。

C言語入門完全攻略ガイド【基礎学習/応用学習/キャリア形成】
更新日 : 2018年5月22日

C言語を最短で習得したい方へ

元々ITリテラシーの高い方やプログラムの学び方がわかっている方であれば、この記事通りに進めていけば、C言語を独学で習得することができるでしょう。

ただし、実際の学習期間中はつまづいている時間がほとんどです。

「なかなかやり遂げられ無い、挫折してしまった」
「時間が足りない」
「情報が少なくどう調べればいいかわからない」
「エラーを解決することができない」

このような悩みを抱えている方も少なく無いと思います。

もう挫折したくない
本業と両立しながら、好きな時間で自分のペースで勉強を続けていきたい
自分だけのカリキュラムで効率的に勉強したい
そんな方はお気軽に侍エンジニア塾までご相談ください。

お一人お一人に専属のインストラクターがつくので、通常のスクールでは難しい、AI(人工知能)や機械学習、IoTについて学習することできます。

まずは『無料体験レッスン』で、弊社のコンサルタントと一緒にあなた専用の学習方やカリキュラムを考えてみませんか?

C言語ならではの学習方法や、現役エンジニアから貴重なアドバイスを受けることができます。

詳しくは下の画像をクリックして弊社サービス内容をご確認ください。

cta_c2

非常識な結果を出す卒業生多数!

エンジニアキャリア戦略

人気記事セレクション

3000名以上来場の人気セミナーが開催決定

18歳で時給6000円だった侍エンジニア塾代表の木内より、『プログラミングで人生を変える』ための学習方法をお教えます。

0からプログラミングを習得し、フリーランスエンジニアになる方法プログラミング学習の効率を劇的に上げる学習メソッドを解説しますので、奮ってご参加ください。

  • 日付:4/20(土),4/27(土)
  • 時間:14:00〜17:35終了予定
  • 場所:当社 道玄坂オフィス
  • 住所:〒150-0043 東京都渋谷区道玄坂2丁目11-1 Gスクエア渋谷道玄坂 4F *Googleマップでは「東京都渋谷区道玄坂2丁目11-1」で検索してください。近隣にスクエア渋谷という別のビルがあるためご留意ください。
  • 参加費:無料
  • URL:https://seminar.sejuku.net/
詳しくは下の画像をクリックして弊社セミナー内容をご確認ください。

LINEで送る
Pocket

この記事が気に入ったら
いいね!をしてフォローしよう

最新情報をお届けします

書いた人

長瀬来

長瀬来

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

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

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

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

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

趣味は語学、読書です。