sizeof演算子で配列の格納可能容量(バイト数)を調べてみます  

アレサ「配列に格納されている文字数を調べた後は


変数の型 

intが4バイト

doubleが8バイトの容量をもっていたように


配列の格納可能容量(バイト)がどれくらいかを調べてみましょう。


その場合は 次のようにプログラムを記述します


#include <stdio.h>

int main(void)

{

char hairetu[10000];

printf("hairetuの格納容量は%dバイトです \n",sizeof(hairetu));

return 0;

}


コンパイル結果


hairetuの格納容量は10000バイトです



このプログラムでは


配列宣言char hairetu[10000];


を実行したのち


(この場合は配列の容量を調べるだけなので


配列の中身を初期化ていません)


printf("hairetuの格納容量は%dバイトです \n",sizeof(hairetu));


のようにsizeof演算子をつかい


sizeof(hairetu)と記述して配列hairetuの格納容量(バイト数)を


printf出力表示しています。


このようにして


char hairetu[10000]の格納容量(バイト数)を調べています。」


ソーラー 「ねえ、アレサ、char hairetu[10000]の格納容量は


10000バイトになったよ


随分おおきいんだね。感心、感心。(^^)


これなら かなりの文字列を格納できるよね。


ところで


なんで hairetuの格納容量は10000バイトになるんだと思う?」


神妙にしているアレサに面白そうに質問してみる。


アレサ「は、はい・・それは


たとえば配列の要素数を5として


char hairetu[5]としたときは


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


のように配列内にデータのいれもの


char型の配列変数が5つできています


char型の配列変数の1つ


hairetu[0]を例にとると


hairetu[0]



2バイトのデータ量をもつ 


2バイト文字 ひらがなや漢字でなく


1バイトのデータ量で表される


「半角英数字または-128から127までの数値」を


おさめるようにできています。


つまり


hairetu[0]

のデータ格納容量は1バイトとなっているのです。


ですので


char型の配列 hairetu[5]は


配列変数を


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

のように5つもつので



配列変数1つ×5=5バイトのデータ格納容量をもつことになります。


このプログラムの


char型の配列 hairetu[10000]


の場合ですと


配列変数1つ×10000=10000バイトのデータ格納容量を


もつわけですの。


それでは


char型の配列宣言でなく


int型の配列宣言


int hairetu[5];


をおこなったときの


配列hairetuのデータ格納容量はいくらになるでしょうか?


int hairetu[5]としたときも


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

のように


配列変数が5つできています




🍓int🍓の配列変数の1つである


hairetu[0]



4バイトのデータ量であらわされる整数値を


おさめるようにできています。


つまり


hairetu[0]

のデータ格納容量は4バイトとなっています。


ですので


int hairetu[5]は


int型の配列変数1つのデータ容量4バイト×5=


20バイトのデータ容量をもつことになります。


実際にsizeof演算子をつかって


int型の配列 hairetu[5]のデータ格納容量を調べてみると


#include <stdio.h>

int main(void)

{

int hairetu[5];

printf("hairetuの格納容量は%dバイトです \n",sizeof(hairetu));

return 0;

}


コンパイル結果


(EAZY IDECの場合)

(Visual Studioの場合)


hairetuの格納容量は20バイトです


となっているのがわかります。」


ソーラー「なあるほど。アレサ、わかりやすい・・な」


ソーラー

「ではでは(^^)~、も~し


char hairetu[10000]を初期化して文字を入力


つまり


char hairetu[10000]="nekoneko";とした場合は


char hairetu[10000]の格納容量(バイト数)はどうなるのかな


nekonekoを格納したのだから(半角英数字1文字1バイト)×8で


8バイトになるのかな。


#include <stdio.h>

int main(void)

{

char hairetu[10000]="nekoneko";

printf(" hairetuの格納容量は%dバイトです \n",sizeof(hairetu));

return 0;

}


アレサ「うふっ それではコンパイルしてみます」



コンパイル結果


hairetuの格納容量は10000バイトです



ソーラー 「8バイトじゃなくて10000バイト・・・


ああ、そうか


配列hairetu自体のデータ格納容量をしらべているから、なかに


どんな文字が格納されているかは関係ないんだ・・」


アレサ 「なにか、外付けハードディスク自体のハードディスク容量と


中に書き込まれているデータ量の関係に似ていますの。」



ソーラー「では最初から配列に要素数を記入せず


自動的に配列内の格納容量がきめられる


char hairetu[]="nekoneko";


と配列宣言初期化した場合はどうなるのかな?


#include <stdio.h>

int main(void)

{

char hairetu[]="nekoneko";

printf("hairetuのデータ格納容量は%dバイトです \n",sizeof(hairetu));

return 0;

}


コンパイルしてみると・・・


コンパイル結果


hairetuのデータ格納容量は9バイトです


ソーラー「nekonekoと8文字(8バイト)格納して


hairetuのデータ格納容量は9バイト・・?」


アレサ「ソーラーさん、このような要素数を記述しない配列宣言


char hairetu[]="nekoneko";を行ったときは


nekonekoにあわせて配列hairetuの大きさ


つまり hairetu[]の[]の中の要素数はきめられていきます。


この場合


char型の配列 hairetuには

配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

hairetu[7]

hairetu[8]


が生成され


hairetu[0]='n'

hairetu[1]='e'

hairetu[2]='k'

hairetu[3]='o'

hairetu[4]='n'

hairetu[5]='e'

hairetu[6]='k'

hairetu[7]='o'

hairetu[8]='\0'


と nekonekoが格納されていますが


nekonekoは文字列なので


自動的に

ナル文字\0が


配列変数 hairetu[8]に格納されることになりますから


sizeof演算子は


nekoneko8文字を、8バイトと


\0を1文字、1バイトと数え上げたので


合計9文字、9バイトと


char型の配列 hairetu[]のデータ格納容量が


printf出力表示されたのではないですか?」


ソーラー 「あっナル文字\0があったか・・・」 

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます