malloc関数はアドレスを戻り値としてもちます そのアドレスをポインタ変数に格納するにはアドレスを格納する型にキャストする必要があります

ソーラー「もう1回プログラムをみてみようかな


#pragma warning(disable: 4996)


#include <stdio.h>


int main(void){


char hairetu[100];


scanf("%s",hairetu);


printf("%s\n",hairetu);


char str[100];


scanf("%s",str);


printf("%s\n",str);


return 0;


}


コンパイル結果


(Visual Studioの場合)

(EAZY IDECの場合)


neko(と入力すると)

neko

nyaonyao(と入力すると)

nyaonyao


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


コマンドプロンプト画面から入力された


文字列nekoを


char型のhairetuに格納し


printf("%s\n",hairetu);


を用いて


文字列nekoをコマンドプロンプト画面に表示しています


その時点でもうすでに


char型(1バイト)×100個=100バイトのメモリを


確保している必要はありませんが


char hairetu[100];


により確保された100バイトのメモリは


プログラムの実行が終了されるまで


確保され続け


その間は


その100バイトのメモリは


コンピュータは使用することができません。



そこでもう


nekoとコマンドプロンプト画面に表示したので


char hairetu[100];


により確保された100バイトのメモリを


コンピュータが使用できるようにしたいというわけなんだ。


メモリを解放してあげるわけなんだね。


こまめにメモリを解放しておけば


コンピュータがフリーズする可能性も少なくなるというわけなんだね。


そこで登場するのがmalloc関数とfree関数なんだ



まあ 次のプログラムをみてよ。


#include <stdio.h>

#include <stdlib.h>


int main(void) {


char *p ;


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


if (p == NULL) {

printf("メモリは確保されませんでした。");

}


else {

printf("メモリは確保されました。");

  printf("そのメモリのアドレスは %pです。\n", p);

}


free(p);


return 0;

}


コンパイル結果


メモリは確保されました 。

そのメモリのアドレスは00D94B40です。


ソーラー「ふふ ぜんぜん 意味が分からないんだ😊」



アレサ「これはどのようなことを行っているプログラムなのですか?」



ソーラー「まず


#include <stdlib.h>


に注目だね。


malloc関数はヘッダファイル<stdlib.h>を


インクルードしないとつかえないんだ。



そして


char *p ;


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


の意味だね。


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



sizeof(char)*100は確保したいメモリのバイト数を表しています


char型は1バイトのデータ格納容量をもちます


ですので


それを100倍した


(char)かける100である


(char)*100は


100バイトのデータ格納容量を持つことになり


sizeof(char)*100 は100をあらわします。


malloc関数は


引数に確保したいメモリのバイト数が渡されると


100バイト分のメモリを確保することになります


例えば

00D94B40

00D94B41

00D94B42

00D94B43

00D94B44

00D94B45

00D94B46

00D94B47

00D94BA2

00D94BA3

のアドレスをもつ100バイト分のメモリが


malloc(sizeof(char)*100);


の実行により


確保されます。


そのとき


確保した100バイトのメモリの


先頭のアドレス


00D94B40をmalloc関数は戻り値として持つことになります



その戻り値となっているアドレスを格納するために


pのポインタ変数宣言


char *p ;


が行われているですね。」


アレサ「そういう意味だったんですの。」


ソーラー「そうなんだよ。


ところで


ここで気になるのが


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


という表現です


ポインタ変数pにアドレスを格納するなら


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


でなく


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


でもよさそうですよね。


どう思うかな。 みなさん」


アレサ「malloc(sizeof(char)*100)はアドレス00D94B40を戻り値として


もつですか・・・」


ソーラー「実は


malloc(sizeof(char)*100)はアドレス00D94B40を戻り値としてもつのですが


(char *)malloc(sizeof(char)*100)


のように


キャスト演算子()を用いて


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


malloc(sizeof(char)*100)の戻り値である


アドレス00D94B40を格納する必要があります


そうしなければ


ポインタ変数pに


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


のように


アドレス00D94B40を渡すことはできないんです


ここがおもしろいところだよね。


アドレスはどうやら普通の数値データとは違うみたいだ。


だからアドレスということをコンピュータに理解させるために


int型など数値を格納する型でなく


キャラアスタリスク型char *にアドレスを格納する必要があるんだね。


イントアスタリスク型int *もアドレスを格納する働きがありますがここで


は用いられません。


それは次のエピソードで説明と行こうかな😊」



🌞    🌞    🌞


このとき


キャラアスタリスク型char *にキャスト演算子()を用いて


アドレス00D94B40を格納することを


キャラアスタリスク型char *にアドレス00D94B40を



          🍋キャスト🍋


するといいます。


キャストとは英語で搭載するという意味です。


天国にいけるC言語入門


https://kakuyomu.jp/works/1177354054881541562/episodes/1177354054884520154


のエピソードでもキャスト演算子は登場しましたね。



#include <stdio.h>


int main(void){


float a;

a=1.5;


printf("あなたの預金額はただいま%d円です。\n",(int )(10000*a));

/*ここでキャスト演算子( )をもちいることにより実数値である(10000*a)をint型にキャストしています*/



return 0;


}


コンパイル結果


あなたの預金額はただいま15000円です。


(統合開発環境EAZY IDECの場合)


あなたの預金額はただいま15000円です。




このようにキャスト演算子


は望みの型にデータを格納するために用いられます


               

                solarplexussより



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

作者を応援しよう!

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

応援したユーザー

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