C,C++において、ポインタを確保しただけで、データ領域を確保せずにデータを書き込んでしまうと、バッファーオーバーフローなどを起こして、メモリーが破壊されてしまいます。
ポインタ不定の例
例えば、次の場合は一見いいように見えますが、ポインタのaは不定のままなので、どこに文字列が格納されてしまうかわかりません。
char *a;
strcpy( a, "abcdefg" )
ポインタと領域の結び付け
ポインタとは、その名の通り、ある領域の場所を指すものです。したがって、正しくは以下のように、配列などの領域の宣言とポインタの結び付けが必要です。
char buf[10];
char *a;
a = buf;
strcpy( a, "abcdefg" )
しかし、これだけでは、まだ脆弱性は残っています。コピーする文字列が、bufのサイズより小さいことが保障されていないと、やはり、バッファーオーバーフローを起こしてしまいます。
コピーする数を引数に持つ関数strncpyを活用するとよいです。
直接代入の意味
コンパイラの力を借りて、下記のようにしてもいいですが、意味が変わってくることに注意してください。
char *a;
a = "abcdefg";
strcpyの場合は、ポインタaが指し示す場所に文字列を格納しますが、上記の場合は、文字列がある場所のアドレスをaに格納するという意味になります。
2021/07/19