char p; p=(char *)malloc(sizeof(char)*100);の実行により動的に確保されたメモリに格納できるデータは文字データと決定されますがmalloc関数にはよりません


ソーラー「ところで


           char p;



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



           char p;


         p = (char*)malloc(100);



と記述することができました


      実はメモリを100バイト分確保したいなら


           char p;


         p = (char*)malloc(100);


のように


単純に


()の中に100を記述すればよいのですね



           char p;


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




           char p;


            p = (char* )malloc(100);



char型のデータ容量×100バイト分のデータを確保することを


表しています


 "char型のデータ容量×100バイト分のデータが確保される"


となると


char型のデータが


動的に確保されたメモリ領域に格納されるようになるように見えますが


char型のデータが


動的に確保されたメモリ領域に格納されるようになるかどうかは


malloc(sizeof(char) * 100);


malloc(100);

の実行により


決定されるわけではありません


この


malloc(sizeof(char) * 100);


malloc(100);

では


単純にメモリが100バイト分確保されるだけなんです😊


malloc(sizeof(char) * 100);

malloc(100);


に等しく


どのようなタイプのデータが動的に確保したメモリ領域に確保されるかまでは決定されません



実は



char* p;



を実行した時点で


すでに


char型の形式でメモリに格納される


'a'

'b'

'c'


のようなデータのみが


動的に確保された100バイト分のメモリに格納されることが決定されているんです」


solarplexuss「ほえぇ ど~いうことぉ?」


アレサ「はいっ



           char p;


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



           char p;


         p = (char*)malloc(100);


が実行されると


ともにmalloc関数によって動的に確保したメモリの先頭のメモリのアドレスが


戻り値として


malloc(sizeof(char) * 100)

つまり

malloc(100)


に返されることになります


この戻り値の返された


malloc(sizeof(char) * 100)


malloc(100)


を (char *)


によって


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


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


のように


キャストして


char*型のポインタ変数pに代入する


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


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


を実行することにより


malloc関数によって動的に確保したメモリの先頭のメモリのアドレス



char* p;


により生成される


char*型のポインタ変数pに代入できるというわけです



 💖💖💖このmalloc関数によって動的に確保したメモリの先頭のメモリのアドレスが代入されたchar*型のポインタ変数p💖💖💖


を用いれば


      💖💖💖char型の配列変数💖💖💖


p[0]

p[1]

p[2]

を生成し


    💖💖💖char型の配列変数💖💖💖


p[0]

p[1]

p[2]

をもちいて


動的に確保したメモリに


データを格納することができます



もちろん


p[0]

p[1]

p[2]


    💖💖💖char型の配列変数💖💖💖


なので


動的に確保したメモリに格納できるデータは


char型の変数に格納できる


'a'

'b'

'c'

等の


文字データや


char型の変数に格納できる


-128から127までの数値となるのですの


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

👇

#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);

}


p[0] = 'a';

p[1] = 'b';

p[2] = 'c';

p[3] = 1;

p[4] = 2;

p[5] = 3;


printf("%c\n", p[0]);

printf("%c\n", p[1]);

printf("%c\n", p[2]);

printf("%d\n", p[3]);//👈🌞動的に確保されたメモリに格納された数値データをコマンドプロンプト画面に表示するために%d出力変換指定子が用いられています

printf("%d\n", p[4]);//👈🌞動的に確保されたメモリに格納された数値データをコマンドプロンプト画面に表示するために%d出力変換指定子が用いられています

printf("%d\n", p[5]);//👈🌞動的に確保されたメモリに格納された数値データをコマンドプロンプト画面に表示するために%d出力変換指定子が用いられています



free(p);


return 0;

}


コンパイル結果


メモリは確保されました。確保されたメモリの先頭のアドレスは 012F4B40です。

a

b

c

1

2

3


solarplexuss「なるほどぉ


  💖💖💖このmalloc関数によって確保したメモリの先頭のメモリのアドレスが代入されたchar*型のポインタ変数p💖💖💖


によって生成される配列変数


p[0]

p[1]

p[2]

に格納できるデータは


char型の変数に格納できる


'a'

'b'

'c'

等の


文字データや


char型の変数に格納できる


-128から127までの数値となる、か


char* p;


を実行した時点で


動的に確保したメモリに格納されるデータのタイプが


決まっていたというわけなんだね


ありがとう 


ソーラー

アレサ


よくわかったなり(*^。^*)」









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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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