天国にいけるC言語入門 ヘキサ構造体 ver2.2126
char p; p=(char *)malloc(sizeof(char)*100);の実行により動的に確保されたメモリに格納できるデータは文字データと決定されますがmalloc関数にはよりません
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;
を実行した時点で
動的に確保したメモリに格納されるデータのタイプが
決まっていたというわけなんだね
ありがとう
ソーラー
アレサ
よくわかったなり(*^。^*)」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます