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