char **p ; p= (char**)malloc(sizeof(char)*100);はchar**型のポインタ変数pに代入できるようmalloc関数を(char**)でキャストしています

solarplexuss「わおう


char*型のポインタ変数pを用いて


動的にメモリを確保したいなら


char *p ;


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


を実行すればいいんでしょう😊


じゃあ


char**型のポインタ変数pを用いて


動的にメモリを確保したいなら



char** p ;


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


を実行すればいいんじゃないかな


そのプログラムは以下のようになるね

👇

#include <stdio.h>

#include <stdlib.h>//🌞malloc関数を使用するときはヘッダファイル<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;

}


ビルド実行結果


エラー (アクティブ) E0513 型 "char *" の値を型 "char **" のエンティティに割り当てることはできません

エラー C2440 '=': 'char *' から 'char **' に変換できません。


solarplexuss「あれ?


なんで


ビルドエラーが表示される??」


ソーラー「さあ、なぜビルドエラーが表示されるのかわかるかな?



ビルド実行結果に


エラー (アクティブ) E0513 型 "char *" の値を型 "char **" のエンティティに割り当てることはできません

エラー C2440 '=': 'char *' から 'char **' に変換できません。


が表示されているのがヒントです」


アレサ「型 "char *" の値を型 "char **" のエンティティに割り当てることはできません


ですか・・・・・」


solarplexuss「エンティティ??」


ソーラー「エンティティとは実体という意味なんだよ


僕も知りませんでした


型 "char **" のエンティティ


って


型 "char **" の実体


のことなんだけど


型 "char **" の実体


とは


char**型のポインタ変数


のことなんだよ」


solarplexuss「なんと そうだったんだ


あれ


今、何をしていたんだったけ?」


アレサ「はい


それは


このプログラムを実行すると

👇


#include <stdio.h>

#include <stdlib.h>//🌞malloc関数を使用するときはヘッダファイル<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;

}


ビルド実行結果


エラー (アクティブ) E0513 型 "char *" の値を型 "char **" のエンティティに割り当てることはできません

エラー C2440 '=': 'char *' から 'char **' に変換できません。


👆なぜ このようなビルドエラーが表示されるかについて


考察していたのですの😊」


solarplexuss「ふ~ん」


ソーラー「


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 *)malloc(sizeof(char)*100);


が実行されると


malloc(sizeof(char)*100)


の実行により確保された100バイト分のメモリの先頭のアドレスが


char *型の形式でメモリに格納されるんでしょう、


でね


char* p ;


により生成されるp



char** p ;


により生成されるp


char*型のポインタ変数


char**型のポインタ変数


の違いはあれど


アドレスを格納するポインタ変数だから


char* p ;


により生成されるp


にも


char* p ;


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



char** p ;


により生成されるp


にも


char** p ;


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


が実行できるんじゃない?」


ソーラー「答えをいっちゃってます」


アレサ「あっ なるほどですの」


ソーラー「


char* p ;


により生成されるp


には


char*型の形式でメモリに格納されているアドレス


しか代入できないんです


同様に


char** p ;


により生成されるp


には


char**型の形式でメモリに格納されているアドレスしか代入できません


ですから


char** p ;


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

  👆char*に御注目下さい

ではなく


char** p ;


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

  👆char**に御注目下さい

なら実行できるということになります・・・」


solarplexuss「なんと」


ソーラー「


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

👇

#include <stdio.h>

#include <stdlib.h>//🌞malloc関数を使用するときはヘッダファイル<stdlib.h>をインクルードしてください


int main(void) {


char** p;


p = (char**)malloc(sizeof(char) * 100);//char👈**型にキャストしています


if (p == NULL) {

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

}


else {

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

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

}


free(p);


return 0;

}


ビルド実行結果



メモリは確保されました。それらのメモリの先頭のアドレスは 00A84B40です。


solarplexuss「おお、やった


char**型のポインタ変数をもちいてメモリを100バイト分確保できた」



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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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