ポインタ変数を用いて動的にメモリを確保することはできます 動的に確保したメモリは開放することができるのでよりメモリリークが起きる可能性が少なくなりました

ポインタ変数を用いて動的にメモリを確保することはできます 動的に確保したメモリは開放することができるのでよりメモリリークが起きる可能性が少なくなりました

Visual Studio2018以前のヴァージョンでは

ポインタ変数をつかってメモリに文字列データを格納することができましたが

Visual Studio2019では

ポインタ変数をつかってメモリに文字列データを格納することはできません



配列hairetuをつかって


char hairetu[]="nekoneko";


と文字列データ"nekoneko"をメモリに格納できたように



char*型のポインタ変数であるhairetuをつかって


char* hairetu="nekoneko";


を実行し


メモリに


文字列データ"nekoneko"を格納することができました


#include <stdio.h>

int main(void){


char* hairetu="nekoneko";


printf("%s\n",hairetu);

printf(hairetu);

return 0;

}


プログラムの実行結果


nekoneko

nekoneko


配列hairetuに格納された文字列データを表示するのに


printf("%s\n",hairetu);

printf(hairetu);のような表示方法がありましたね



さらに


今用いた

ポインタ変数であるhairetuを使って


文字列データ"nekoneko"を格納したメモリ領域とは


別のメモリ領域に文字列データを格納することができます


次の例をみていきましょう。


#include <stdio.h>


int main(void){


char* hairetu="nekoneko";

hairetu="nekofunnjyatta";

printf(hairetu);


return 0;

}



プログラムの実行結果


nekofunnjyatta




char* hairetu="nekoneko";

を実行した場合


あるメモリ領域に文字列データ"nekoneko"が格納されることになります


その時 あるメモリ領域の先頭のメモリのアドレスが


char*型のポインタ変数hairetuに格納されることになります


さらに


hairetu="nekofunnjyatta";


を実行することにより


文字列データ"nekoneko"を格納しているメモリ領域とは


別のメモリ領域に文字列データ"nekofunnjyatta"が格納されることになります


その時 文字列データ"nekoneko"を格納しているメモリ領域とは


別のメモリ領域の先頭のメモリのアドレスが


char*型のポインタ変数hairetuに格納されることになります


char* hairetu="nekoneko";

hairetu="nekofunnjyatta";


を実行することにより


あるメモリ領域には文字列データ"nekoneko"が


あるメモリ領域とは別のメモリ領域には文字列データ"nekofunnjyatta"



格納されることになったのですが


文字列データ"nekoneko"



文字列データ"nekofunnjyatta"


によって


上書きされるわけではありません


文字列データ"nekoneko"



文字列データ"nekofunnjyatta"


は両方それぞれ


違うアドレスのメモリ領域に記憶されています。


ところで


普通の変数


例えばint a;のaなら


変数aにa=1;


を実行した後


a=2;を実行すると


入れ物自体は同じ変数aなので変数aの格納している値は1から2に入れ替ります



同様に


char* hairetu="nekoneko";


を実行した場合は


あるメモリ領域の先頭のメモリのアドレスが


char*型のポインタ変数hairetuに格納されることになります


さらに


hairetu="nekofunnjyatta";


を実行した場合は


あるメモリ領域とは別のメモリ領域の先頭のメモリのアドレスが


char*型のポインタ変数hairetuに格納されることになります


この場合


char*型のポインタ変数hairetuに格納されているアドレスは


あるメモリ領域とは別のメモリ領域の先頭のメモリのアドレスであり


(文字列データ"nekofunnjyatta"を格納しているメモリ領域の先頭のメモリのアドレスであり)



あるメモリ領域の先頭のメモリのアドレスは


(文字列データ"nekoneko"を格納しているメモリ領域の先頭のメモリのアドレスは)



上書きされて消えてしまっているというわけです


ところで

char*型のポインタ変数hairetuを使って文字列データをメモリに格納した場合


そのメモリに格納された文字列データを表示するには


printf("%s\n",hairetu);

printf(hairetu);のような表示方法があります


printf("%s\n",hairetu);

printf(hairetu);


を実行すると


char*型のポインタ変数hairetuに格納されたアドレスのついたメモリを先頭とするメモリ領域に


格納されている文字列データが表示されることになります


ですので



char* hairetu="nekoneko";

を実行した後

hairetu="nekofunnjyatta";

を実行した場合に


printf("%s\n",hairetu);

printf(hairetu);


を実行すると


char*型のポインタ変数hairetuに格納されているアドレスは


あるメモリ領域とは別のメモリ領域の先頭のメモリのアドレス


(文字列データ"nekofunnjyatta"を格納しているメモリ領域の先頭のメモリのアドレス)


であるので


nekofunnjyatta


がコマンドプロンプト画面に表示されることになります



となると・・・


char* hairetu="nekoneko";

を実行した後

hairetu="nekofunnjyatta";

を実行した場合に


あるメモリ領域に格納されている


文字列データ"nekoneko"を表示したい場合・・・


どうしたらいいのかな?ということになりますね


char*型のポインタ変数hairetuに格納されているアドレスは


あるメモリ領域とは別のメモリ領域の先頭のメモリのアドレス


(文字列データ"nekofunnjyatta"を格納しているメモリ領域の先頭のメモリのアドレス)


であるので


printf("%s\n",hairetu);

printf(hairetu);


を実行すると


nekofunnjyatta


がコマンドプロンプト画面に表示されることになります


そう


char*型のポインタ変数を用いて文字列データを格納する


char* hairetu="nekoneko";

を実行した後

hairetu="nekofunnjyatta";

を実行した場合


あるメモリ領域には文字列データ"nekoneko"



あるメモリ領域とは別のメモリ領域には文字列データ"nekofunnjyatta"


が格納されることになるのですが


あるメモリ領域に格納された文字列データ"nekoneko"には


char*型のポインタ変数を用いて


アクセスできなくなるのです


つまり利用できない文字列データ"nekoneko"を格納したメモリ領域が


放置されたままとなります


たとえば


char*型のポインタ変数hairetuを用いた


char* hairetu="nekoneko";

hairetu="nekofunnjyatta";

hairetu="nekofunny";

hairetu="nekonekofun";

hairetu="nekoninjyatta";


を次々と実行していくと


文字列データ


"nekoneko"

"nekofunnjyatta"

"nekofunny"

"nekonekofun"

"nekoninjyatta"


それぞれ別のメモリ領域に格納されることになるのですが


char*型のポインタ変数hairetuを用いてアクセスできるのは


一番最後の文字列データ"nekoninjyatta"を格納しているメモリ領域だけとなり


その他の

"nekoneko"

"nekofunnjyatta"

"nekofunny"

"nekonekofun"


を格納しているメモリ領域は


利用できないまま


コンピュータのメモリ領域内に取り残されることになります


このような状態をメモリリークといいます


このようなことがつづいていくと


コンピュータの利用できるメモリ領域が少なくなっていき


コンピュータがフリーズを起こす場合があります


そのため


今回の改定では


ポインタ変数を用いてメモリに文字列データを格納することができないようにした


・・・のかな?(笑)






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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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