キャラアスタリスクchar *型のポインタ変数に イントアスタリスクint *型に格納されたアドレスを代入することはできません

ソーラー「さてさて さっきの続きっと」


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

}


free(p);


return 0;

}


コンパイル結果


メモリは確保されました 。

そのメモリのアドレスは00D94B40です。



ソーラー「


ここで


malloc(sizeof(char)*100)はアドレス00D94B40を戻り値として


もつのですが


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


のように


キャスト演算子()を用いて


キャラアスタリスク型char *に


malloc(sizeof(char)*100)の戻り値である


アドレス00D94B40を格納する必要があります


そうしなければ


ポインタ変数pに


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


のように


アドレス00D94B40を渡すことはできないんです


ここがおもしろいところだよね。


アドレスはどうやら普通の数値データとは違うみたいだ。


だからアドレスということをコンピュータに理解させるために


int型など数値を格納する型でなく


キャラアスタリスク型char *にアドレスを格納する必要があるんだね。


イントアスタリスク型int *もアドレスを格納する働きがありますがここで


は用いられません。


なぜなら


char *p ;


により作製されたポインタ変数pは


キャラアスタリスクchar *型のポインタ変数だからです。


このプログラムでは


char *p ;


が実行されているため


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


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


と記述することはできません。


キャラアスタリスクchar *型のポインタ変数に


イントアスタリスクint *型に格納されたアドレスを格納することはできないというわけです


実際に


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


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


と記述したプログラムを実行してみると・・・」



#include <stdio.h>

#include <stdlib.h>


int main(void) {


char *p;


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

/*↑この部分を(char*)から(int*)に変更してみました。

うまくコンパイルできるでしょうか?*/


if (p == NULL) {

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

}


else {

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

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

}


free(p);


return 0;

}


コンパイル結果

(EAZY IDECの場合)

ファイル「C:/Users/solarplexuss/AppData/Local/EasyIDEC/project/hhhhhhhh/main.c」の

「8行目」で記述エラーを発見しました。

警告

assignment from incompatible pointer type


(互換性のないポインタの型からの代入という意味ですね)


(assignmentは代入という意味で


incompatibleは互換性がないという意味です。


すなわち互換性のないchar*型のポインタ変数に


int *型に格納されているアドレスを


代入することはできないということをあらわしています。)



ビルド結果


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

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



ソーラー「う~ん、うまくコンパイルできないね😊」


アレサ「ソーラーさん楽しそうですの。」


ソーラー「malloc関数の説明はC言語を学び始めたころから


ずうっとやってみたかったことなんだ。


だから


まったりのんびりじっくり解説していこうとおもっているんだ。」










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

作者を応援しよう!

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

応援したユーザー

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