【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
ではでは