|
こんばんは。
初心者さんが提示したプログラムと、下のプログラムの違いはわかりますか。
下の例では、mallocを用いずに、直接ポインタに文字列リテラルのアドレス
を代入しています。こうすると、ポインタyは文字列リテラル"ABCDRFGHIJ"
を指すようになり、printfでポインタの指す文字列を表示することができます。
char *y;
y ="ABCDRFGHIJ";
printf("%s\n",y);
さて、
char *y;
y = (char *)malloc(11);
y ="ABCDRFGHIJ";
printf("%s\n",y);
free(y);
の場合ですが、ポインタyは、mallocによりメモリ上に確保された11バイト
の領域のアドレスを代入しています。ここに、y ="ABCDRFGHIJ";とすると、
yに文字列リテラル"ABCDRFGHIJ"のアドレスが代入され、mallocで得られた
領域のアドレスは失われてしまいます。このyを使って、printfを行うと、
文字列の表示は行うことができます。けれども、その次のfreeで開放するのは、
mallocで得られたアドレスではなく、文字列リテラルのアドレスになり、
プログラムは暴走することになります。
回避方法ですが、mallocで得られた領域に、文字列"ABCDRFGHIJ"
をstrcpy関数によりコピーしてください。そうすると、ポインタyの指すのは、
文字列の格納されたmallocで得られた領域になり、処理は正常に行われます。
|