次に変数の寿命について学んでみましょう。変数に関するデータはコンピュータのメモリに保存されるだけでなく消去もされます。どの時点で消去されるのでしょうか?😊

ローカル変数はそのローカル変数が宣言された{}ブロック内の命令文がすべて実行されるとメモリに保存されたローカル変数の名前、ローカル変数の格納している値とともにコンピュータのメモリから消去されます

ローカル変数は


そのローカル変数が宣言された{}ブロック内の命令文が


すべて実行されると


そのローカル変数に格納された値とともに


コンピュータのメモリから消えてしまいます。


ソーラー「ローカル変数は消えてしまう?の?


これはど~言う意味なんだい」


アレサ「はいっそれは、です


次のプログラムでは😊

👇

#include <stdio.h>


int main(void){

int a=1;

printf("%dをとりこみました。\n",a);

return 0;

}

👆

main関数が実行されると


main関数のローカル変数aが変数宣言された


         💖ブロック{👉👈}内の命令文💖

           

int main(void){👉

int a=1;

printf("%dをとりこみました。\n",a);

return 0;

👈}



全て実行されます。


すると


main関数のブロック{}内で


変数宣言、初期化


int a=1;


により生成された


main関数のローカル変数aは


main関数のローカル変数aに格納された値1とともに


コンピュータのメモリの節約のため


コンピュータのメモリから消去されます。


つまり


あるメモリにaという名前が割り振られていたのですが


その名前が消えてしまうというわけです。


そしてそのメモリに格納されていたデータも消えてしまうのですの。



また


次の自作関数fが設定されたプログラムをごらんくださいですの

👇

#include <stdio.h>


void f(void){

int a=1;

printf("%dをとりこみました。\n",a);

}


int main(void){

int b;

f();

printf("%dをとりこみました。\n",b);

return 0;

}

👆


このプログラムにおいて


自作関数f();が実行されると


自作関数の定義のブロック{👉👈}内の命令文が全て実行されます。


void f(void){👉

int a=1;

printf("%dをとりこみました。\n",a);

👈}



自作関数f();の実行が終了すると


自作関数のブロック{}内で


変数宣言

int a=1;


により生成された自作関数fのローカル変数aは


自作関数fのローカル変数aに格納された値1とともに


コンピュータのメモリの節約のため


コンピュータのメモリから消去されます。


つまり


あるメモリを管理するために付けられていたaという名前が


消えてしまうというわけです。


実はaという名前の変数を変数宣言により作製し


あるメモリを変数aで管理しているとき


そのaという名前のデータもメモリに格納されているのです


そのaという名前のデータがメモリから消去されるというわけですね。


そして


aと名づけられたメモリに格納されていたデータも消えてしまいます。


ではでは(^o^)/次のプログラムをご覧ください」


ソーラー「は~い」


アレサ


「ローカル変数aが変数宣言されたブロック{👉👈}内の命令文が


全て実行されると


ローカル変数aは


その名前とともに


ローカル変数aに保存された値ごと


コンピュータのメモリから消去される


このことは


ローカル変数aが


main関数や自作関数のブロック内で定義された場合だけでなく


ローカル変数aが


       🍊for文のブロック内で定義された場合にもあてはまります。🍊


はいっ それでは


こちらがそのサンプルプログラムとなります。

👇

#include <stdio.h>


int main(void){

int a;

for(a=1;a<3;a++){

int b;

for(b=1;b<4;b++){

int c;

for(c=1;c<5;c++){

printf("%d回目のご飯はNouvel de かつおです\n",c);

}

}

}

return 0;

}


ソーラー「なぁ~にぃ~」


アレサ「このプログラムは


for{]文3重入れ子構造になっていますね。


この場合


まず命令文


int c;

for(c=1;c<5;c++){

printf("%d回目のご飯はNouvel de かつおです\n",c);

}


からプログラムが実行されます。


for(c=1;c<5;c++)のはたらきにより

c=1

c=2

c=3

c=4

のときの


printf("%d回目のご飯はNouvel de かつおです\n",c);

が生成される


つまり


printf("%d回目のご飯はNouvel de かつおです\n",1);

printf("%d回目のご飯はNouvel de かつおです\n",2);

printf("%d回目のご飯はNouvel de かつおです\n",3);

printf("%d回目のご飯はNouvel de かつおです\n",4);


が生成されることになります


c++のはたらきにより


cの値は4から5へと変化します


c=5とローカル変数cに5が代入された後


c<5の条件式の判定により


for文の繰り返しはストップします。


ですので最終的にローカル変数cに格納されている値は5となっています。



👇

int c;

for(c=1;c<5;c++){

printf("%d回目のご飯はNouvel de かつおです\n",c);

}

👆この命令文自体は


int b;

for(b=1;b<4;b++){👉

int c;

for(c=1;c<5;c++){

printf("%d回目のご飯はNouvel de かつおです\n",c);

}

👈}


の{👉と👈}で示される💖ブロック{}内💖に記述されています。


ですので{👉と👈}内の命令文


int c;

for(c=1;c<5;c++){

printf("%d回目のご飯はNouvel de かつおです\n",c);


が実行されると


for(b=1;b<4;b++){👉👈}内で定義されたローカル変数cは


コンピュータのメモリの節約のため


メモリにつけられたcという名前


ローカル変数cに格納されている数値5ごと


コンピュータのメモリから消去されますの。」


ソーラー「へぇ(*^。^*)」


アレサ「


同様に👇のソースコードの


{👉👉と👈👈}で示されるブロック内で


定義されたローカル変数bは


int a;

for(a=1;a<3;a++){👉👉

int b;

for(b=1;b<4;b++){

int c;

for(c=1;c<5;c++){

printf("%d回目のご飯はNouvel de かつおです\n",c);

}

}

👈👈}


{👉👉と👈👈}内のソースコード


int b;

for(b=1;b<4;b++){

int c;

for(c=1;c<5;c++){

printf("%d回目のご飯はNouvel de かつおです\n",c);

}

}


がすべて実行されると


{👉👉と👈👈}内で


int b;


と変数宣言されたローカル変数bは


コンピュータのメモリの節約のため


メモリに付けられたbという名前


ローカル変数bに格納されている数値4ごと

(このときローカル変数bに格納されている数値は4となっています。)


コンピュータのメモリから消去されますの」


ソーラー「おおぅ なんと


for文のブロック{}内で定義されたローカル変数は


for文のブロック{}内の命令文がすべて実行されると


ローカル変数に格納された値ごと


消去されるんだね。」


アレサ「はい、そうなんです


ブロック{}内で変数宣言されたローカル変数のデータ情報は


ブロック{}内の命令文が実行されると


すぐに ローカル変数ごと


メモリから消去されます。


同様に


元のソースコードでは


main関数のブロック{👉👈}内では


ローカル変数aが変数宣言されていますが


#include <stdio.h>


int main(void){👉

int a;

for(a=1;a<3;a++){

int b;

for(b=1;b<4;b++){

int c;

for(c=1;c<5;c++){

printf("%d回目のご飯はNouvel de かつおです\n",c);

}

}

}

return 0;

👈}


main関数が実行されると


main関数のブロック{👉👈}内で定義されたローカル変数aは

(この時for(a=1;a<3;a++)のはたらきによりaの値は3となっています)


コンピュータのメモリの節約のため


メモリに保存されているaという名前も


ローカル変数aに格納されている数値3も


コンピュータのメモリから消去されますの」


ソーラー「つまり


main関数が実行されたら


main関数のブロック{}内で定義されたローカル変数そのものが


コンピュータのメモリの節約のため


格納している数値ごとコンピュータのメモリから消えてしまうんだね。」



😊

実は


ソースコードがコンパイルされて


プログラムが実行されたあとは


メモリに格納されたデータはすべて消去され


コンピュータのメモリ内には何もデータは残りません







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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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