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

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

ローカル変数は


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


すべて実行されると


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


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


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


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


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


次のプログラムでは


#include <stdio.h>


int main(void){

int a=1;

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

return 0;

}


main関数が実行されると


int a=1;

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


int main(void){👉

int a=1;

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

return 0;

👈}



全て実行されます。


すると


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


int a=1;と


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


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


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


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


つまり


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


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


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



また次の自作関数のプログラムにおいても


#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;と変数宣言されたローカル変数aは


格納された値1とともに


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


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


つまりメモリを管理するために付けられていた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=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);

}

👈}


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


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



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

int c;

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

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

👈}

により実行されると


ブロック内で定義されたローカル変数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);

}

}

👈👈}


👆のソースコードが実行されると


{👉👉と👈👈}内で変数宣言されたローカル変数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関数が実行されると


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

(この時a=3となっているのですが)


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


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


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


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


ソーラー「つまりmain関数が実行されたら


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


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


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


このことは つまり


ソースコードがコンパイルされて実行されたあとは


コンピュータのメモリ内には何もデータが残っていないということなんだね」








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

作者を応援しよう!

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

応援したユーザー

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