char**p; p = (char**)malloc(sizeof(char*)*100);を実行した場合は400バイト分のメモリが動的に確保されます


ソーラー「先のエピソードで


char** p ;


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


の実行により


メモリを100バイト分確保することができました


その際のポイントは


sizeof(char)




単なる数値データ


                  1



を表しているということでしたね


malloc(sizeof(char)*100)


が実行されると


100バイト分のメモリが動的に確保され


戻り値として


動的に確保したメモリの先頭のアドレスが


malloc(sizeof(char)*100)に


返されることになります


このとき


malloc(sizeof(char)*100)に


戻り値として返された


動的に確保したメモリの先頭のアドレスは


キャラアスタリスクchar*型の形式でメモリに格納されているのか


イントアスタリスクint*型の形式でメモリに格納されているのか


ダブルアスタリスクdouble*型の形式でメモリに格納されているのか


char**型の形式でメモリに格納されているのか


int**型の形式でメモリに格納されているのか


double**型の形式でメモリに格納されているのか


メモリに格納されている形式が確定されていません


そして


char** p ;


により生成されるp


には


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


ですから


char** p ;


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

  👆char*に御注目下さい

ではなく


char** p ;


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

  👆char**に御注目下さい



malloc(sizeof(char)*100)を


char**型にキャストする必要がありました


そうすることにより


char**型のポインタ変数pに


動的に確保したメモリの先頭のアドレスが格納されるというわけです


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

👇

#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("メモリは%dバイト確保されました。",sizeof(char) * 100);

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

}


free(p);


return 0;

}


ビルド実行結果



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


solarplexuss「おお、やった


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




ソーラー「ということは



🌞    🌞    🌞    🌞    🌞    🌞 


            char** p;


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


🌞    🌞    🌞    🌞    🌞    🌞 



が実行されるときの仕組みも


もう理解できるんじゃないかな?



char** p;


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


では


sizeof(char)でなくsizeof(char*)と記述されていますが


どうかな?😊」


solarplexuss「今までのエピソードから



char** p;


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


の仕組みは


もうわかったっち



char** p ;


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


の実行により


メモリは動的に400バイト分確保されるんでしょ


どうだ!」


アレサ「(*´▽`*)」


solarplexuss「


ポイントは


sizeof(char*)




単なる数値データ


                  4



を表しているということでしたね えへっ


malloc(sizeof(char*)*100)


が実行されると


400バイト分のメモリが動的に確保され


戻り値として


動的に確保したメモリの先頭のアドレスが


malloc(sizeof(char*)*100)に


返されることになります


このとき


malloc(sizeof(char*)*100)に


戻り値として返された


動的に確保したメモリの先頭のアドレスは


キャラアスタリスクchar*型の形式でメモリに格納されているのか


イントアスタリスクint*型の形式でメモリに格納されているのか


ダブルアスタリスクdouble*型の形式でメモリに格納されているのか


char**型の形式でメモリに格納されているのか


int**型の形式でメモリに格納されているのか


double**型の形式でメモリに格納されているのか


メモリに格納されている形式が確定されていません


そして


char** p ;


により生成されるp


には


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



char** p ;


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

  👆char*に御注目下さい

ではなく


char** p ;


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

  👆char**に御注目下さい



malloc(sizeof(char)*100)を


char**型にキャストする必要があるんだね


そうすることにより


char**型のポインタ変数pに


動的に確保したメモリの先頭のアドレスが格納されるというわけです




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

👇


     さあ どっかなぁ  ビルド実行できるかな? 


#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("メモリは%dバイト確保されました。",sizeof(char*) * 100);

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

}


free(p);


return 0;

}


ビルド実行結果


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


ソーラー「お見事です


char** p;


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


の仕組みが理解できることにより




いよいよ



🌞    🌞    🌞    🌞    🌞    🌞 


         char**型の変数を用いて


      2次元配列的にメモリを動的に確保する


🌞    🌞    🌞    🌞    🌞    🌞 


ことができるようになるんです





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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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