トライとエラーを繰り返す

書きたいものをかきます

【C言語】ポインタ変数の初期化

備忘録的な

 

ポインタ変数の初期化について

 

変数を宣言した場合、宣言したタイミングではめちゃくちゃな値が入っている

 

例えば、

<stdio.h>

main()

{

   int i;

   printf("%d",i);

}

 

コンパイルして実行ファイルを実行した場合、iの実行結果は 78945632、、 とか、とにかく適当な値になる

 

まあ、通常の変数であれば、最終的には

↓のように値を更新するだろうから、あまり問題にならないことも多い。

 

<stdio.h>

main()

{

   int i;

   printf("%d",i);

   i = 1;             /*変数更新*/

   return;

}

 

ところが、ポインタ変数で初期化をしないとえらいことになったりする。

 

main()

{

   int *i,j;

   j = *i + 10;

   return;

}

こんな調子でプログラムをつくっていくと、とんでもないバグが引き起こされる。

 

というのも、ポインタ変数も変数には違いないから、宣言した時点ではめちゃくちゃな値が入っている。

ここでポインタ変数が示す初期アドレスは、「使っていい」メモリとは限らない。他のタスクが使っている領域だったり、OSで決められた割当領域ではないかもしれないのだ。

 

初期化の方法としては、以下のようにする方法がある。

 

<stdio.h>

main()

{

   int *i,j;

   i = &j;

   return;

}

 

つまり、「同じ型の変数をもう一つ宣言して、安全なアドレスを代入する」方法だ。

 

「安全なアドレス」というのは、「使っていいアドレス」ということだ。

上の例でいうと、変数jの「値」は、めちゃくちゃな値が入っている。しかし、変数jの「アドレス」は、ちゃんと「使っていいアドレス」が割り当てられている。

同様に、変数iの「値」は、めちゃくちゃな値が入っている。(つまり、変数iの差すアドレスは、めちゃくちゃなアドレスだということ)。

※変数iの「アドレス」(ポインタ変数iのアドレス、ということ)は、当然ちゃんと「使っていい」アドレスが割り当てられている。

 

「変数jのアドレス」を「変数iの値」に代入することで、安全なアドレスを割り当てることができる。

 

もっとも、この場合変数jは変数iの初期化のためだけに使われることになるから、その分メモリを使うにはなるが。

 

NULLで初期化したりすることもあるけど、通常変数モードと使い分けとかするには、「安全なアドレスを代入」がいいのかな?と思ってる

 

ポインタ変数はつまづきやすいところだから、間違えないように理解したいところですね…

 

ご指摘等あればぜひ教えていただきたいですm(_ _)m

 

ではでは