sizeof演算子はキャラアスタリスク型char*に作用することができsizeof(char*)は4を表します つまりchar*は4バイトのデータ格納容量をもちます

ソーラー「それでは


p = (char *)malloc(sizeof(char) * 100);

p = (char *)malloc(100);


と記述しても


ちゃんとプログラムを実行できたところで


お昼にしようかな・・・😊」







ソーラー「それでは午後のこの時間では



char*p;



p = (char *)malloc(sizeof(char*) * 100);



を実行した場合


何バイト分のメモリが確保されることになるか考察してみたいと思います


solarplexuss「


char*p;


p = (char *)malloc(sizeof(char*) * 100);


???


さっきは


char*p;


p = (char *)malloc(sizeof(char) * 100);


を実行したよね


今度は


char*p;


p = (char *)malloc(sizeof(char*) * 100);


を実行するの?


さっきの


char*p;


p = (char *)malloc(sizeof(char) * 100);


と何がちがうのかな?


アレサ「


今回


実行する


char*p;


p = (char *)malloc(sizeof(char*) * 100);


では


malloc関数の引数が


sizeof(char) * 100

でなく

sizeof(char*) * 100


になっています」



solarplexuss「あっほんとうだ


sizeof(char*) * 100??


なんじゃらほい?」



アレサ「


sizeof(char) * 100


では()の中に変数の型char


が用いられていますが


sizeof(char*) * 100


では()の中に変数の型char*


が用いられています


これは、どういうことなのでしょうか?」



ソーラー「やあっぱしそう思う😊


sizeof(char*) * 100


()の中にキャラアスタリスク型char*が用いられている


sizeof(char*) * 100



一体何を意味しているのか?


sizeof(char*) * 100

のように


sizeof演算子はそもそもchar*に作用することができるのかということですね





sizeof演算子とは


変数の型が何バイトのデータ格納容量を持つかを


示すことができます


char型は1バイトのデータ格納容量をもつので


sizeof(char)は1


をあらわします


int型は4バイトのデータ格納容量をもつので


sizeof(int)は4


をあらわします


float型は4バイトのデータ格納容量をもつので


sizeof(float)は4


をあらわします


float型は8バイトのデータ格納容量をもつので


sizeof(double)は8を表します




キャラアスタリスク型char*は


char* a;


の実行により


char*型のポインタ変数aを生成することができ


char*型のポインタ変数aには


char型の変数のアドレスを格納することができました


char*型を用いればメモリにアドレスを格納することができるというわけです



つまり


キャラアスタリスク型char*は


char型の変数のアドレスというデータを格納できる型なので


データ格納容量がある


となれば


char*型にsizeof演算子を作用させた


sizeof(char*)


char*型のデータ格納容量を示すというわけです」



solarplexuss「なるほど


char*型にはアドレスデータを格納できるデータ格納容量があるわけなのか


じゃあ


char*型のデータ格納容量って何バイトになるのかな?」


ソーラー「では


実際に


printf("%d\n", sizeof(char*));


を実行して


char*型のデータ格納容量が何バイトなのかを調べてみようかな


そのプログラムはこちらです」

👇

#include <stdio.h>


int main(void) {


printf("%d\n", sizeof(char*));

return 0;

}


ビルド実行結果

4



アレサ「4が表示されました


char*型のデータ格納容量は4バイトなのですね」



solarplexuss「4!


がでたっちゃ


はは~ん


char*型のデータ格納容量は4バイトなのか~


初めて知ったっちゃ💖


でも


なんでchar*型のデータ格納容量は4バイトなのかな?



ちょっとこのプログラムをみたっちゃ

👇

#include <stdio.h>


int main(void) {

char a;

char* b;


b = &a;


printf("%p\n",b);

return 0;


ビルド実行結果


010FFEE7


solarplexuss「このプログラムのように


4バイトのデータ格納容量を持つchar*型のポインタ変数bを用いれば


メモリに


char型の変数aのアドレス&aを格納できる


ということは


char型の変数aのアドレスは


4バイトのデータ量をもつってこと?なのかな?


どう?」


ソーラー「OH!~イエ~ス


そうなんです


次のプログラムをご覧ください

👇


#include <stdio.h>


int main(void) {

char a;

printf("%p\n",&a);


return 0;

}


ビルド実行結果


0073FCDF


solarplexuss「なんかプログラムが短くなった!」


ソーラー「このプログラムでは


char型の変数aのアドレス


0073FCDF


が表示されています


ということは


0073FCDF


というデータがメモリに格納されているというわけです


この


0073FCDF



コンピュータのメモリには0と1で


0000 0000 0101 0011 1111 1100 1101 1111


と格納されています



😊   😊   😊   😊   😊   😊   😊


0073FCDF


0

0

7

3

F

C

D

F


16進数であり


2進数では


それぞれ


0000

0000

0101

0011

1111

1100

1101

1111


と表されます


😊   😊   😊   😊   😊   😊   😊



0と1は


それぞれ1ビットのメモリのお部屋に格納されているので


0000 0000 0101 0011 1111 1100 1101 1111



32ビットのお部屋


つまり


4バイトのお部屋に格納されていることになります


つまり


アドレスデータは


4バイトのデータ量をもつので


アドレスデータをメモリに格納することのできる


キャラアスタリスク型char*は4バイトのデータ格納容量をもつというわけなんです」


solarplexuss「そっか


アドレスもメモリに格納されているんだね」




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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る