C言語関係掲示板

過去ログ

No.569.mallocで確保した領域に文字列をセット

[戻る] [ホームページ]
No.5215

malloc関数について。
投稿者---初心者(2003/02/16 23:05:37)


main()関数1個で作成してOK。
まず、11バイトのメモリをmalloc()関数で確保する。
そこに、以下の定数(型は文字型)を書き込む。
  "ABCDEFGHIJ"(最後は¥0)
メモリに正しくその文字列がセットされたかどうかprintf()で画面表示する。
確保したメモリをfree()で解放し終了する。

#include<stdio.h>
#include<stdlib.h>

void main(void)
{
	char *y;

	y = (char *)malloc(11);

	y ="ABCDRFGHIJ";

	printf("%s\n",y);
		
	free(y);	
}

自分でこういう風に作ってみたんですが、エラーなどはないのに、実行するとうまくいきません。

環境
visual studio6.0
visual c++6.0
実行はMs-Dosプロンプトを使います。
Windows ME


No.5216

Re:malloc関数について。
投稿者---ともじ(2003/02/16 23:32:26)


こんばんは。

初心者さんが提示したプログラムと、下のプログラムの違いはわかりますか。
下の例では、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で得られた領域になり、処理は正常に行われます。



No.5218

Re:malloc関数について。
投稿者---初心者(2003/02/17 00:32:24)


ありがとうございます。

そうなんですよ、malloc関数の部分をコメント扱いにしても出来たんです。
それで、コメント扱いにしないとエラーになる。
今度は、freeをコメントにしてみる。
と、また普通に出来たのです。
この謎が解けなかったんですよね。

ありがとうございました。