天国にいけるC言語入門 ヘキサ構造体 ver2.2127
ポインタ変数を用いて動的にメモリを確保することはできます 動的に確保したメモリは開放することができるのでよりメモリリークが起きる可能性が少なくなりました
ポインタ変数を用いて動的にメモリを確保することはできます 動的に確保したメモリは開放することができるのでよりメモリリークが起きる可能性が少なくなりました
ポインタ変数を用いて動的にメモリを確保することはできます 動的に確保したメモリは開放することができるのでよりメモリリークが起きる可能性が少なくなりました
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"
を格納しているメモリ領域は
利用できないまま
コンピュータのメモリ領域内に取り残されることになります
このような状態をメモリリークといいます
このようなことがつづいていくと
コンピュータの利用できるメモリ領域が少なくなっていき
コンピュータがフリーズを起こす場合があります
そのため
今回の改定では
ポインタ変数を用いてメモリに文字列データを格納することができないようにした
・・・のかな?(笑)
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます