dポイントプレゼントキャンペーン実施中!

文字列のメモリ保持期間とポインタについてわからないので教えてください。

よくポインタの説明に、文字列を使った下記のようなサンプルコードが紹介されます。
char* s;
s = "abcdefg";
printf("%s",s);
(http://www2.netf.org/pointer3.html から引用)

この"abcdefg"により確保された領域がいつまで保持されるのかわかりません。
・これを実行しているメソッドを抜けるまでなのか?
・free(s)するまでなのか?(free(s)しなければいけないのか?)

この例だとprintfして終わっていますが、sを戻り値として返却して他で利用したり、オブジェクトを生成して、そのメンバ変数に
obj1->field1 = "value";
というように格納して利用することとか考えると、領域は勝手に開放されず、やっぱり明示的にfreeするということでしょうか?

freeしないといけない、なんて記述も見たことがなくよく理解できずにいます。
よろしくお願いします。

A 回答 (3件)

場合によります。



>char* s;
>s = "abcdefg";
>この"abcdefg"により確保された領域がいつまで保持されるのかわかりません。
>・これを実行しているメソッドを抜けるまでなのか?
>・free(s)するまでなのか?(free(s)しなければいけないのか?)

この場合は、プログラムがメモリにロードされた時点でメモリ上に"abcdefg"が配置され、
その先頭アドレスを char型のポインタ変数sに代入しているだけです。
# 「文字列リラテル」で検索されるとよいでしょう。
で、メモリ上に配置され"abcdefg"は、プログラムが終了するまで有効ですから解放する必要はありません。
# ちなみに「定数」扱いになりますので普通は書き換えできません。

>オブジェクトを生成して、そのメンバ変数に
>obj1->field1 = "value";
>というように格納して利用する
実装にもよりますが…たいていクラス内で「内容を変更する」必要がある場合は、領域を確保して「コピー」しているかと。

free()が必要なのは、malloc()やcalloc()等で明示的に確保した場合…になります。
標準関数でどの程度あるかは不明ですが…
「呼び出し元が解放の責任を負う」という作りの関数を使用した場合は、当然free()は必要ですが。
# strdup()とか。
    • good
    • 0
この回答へのお礼

ダブルクォートで作成した文字列は静的な定数として扱うんですね。
文字列の内容を変更するような場合には、メモリを確保してそこに内容をコピーしてから使用するというのは初耳でした。

お礼日時:2010/04/30 02:47

> この"abcdefg"により確保された領域がいつまで保持されるのかわかりません。



"abcdefg"は文字列リテラルとしてソースコードに直書きされています。
こういうものはプログラムがメモリ上にロードされた時に、静的なメモリ空間に割り当てられます。
(PCだと実行時にRAM上にロードされますが、マイコン用の組み込みソフトなどではROM上のメモリ空間に割り当てられることもあります)

したがって、このメモリ領域はプログラムが実行された時から終了するまで保持されます。

もっとも、"abcdefg"はずっと存在しますが、それを指してるポインタ変数「s」はローカル変数なので、関数を抜けた時点で消滅します。(static宣言されている場合は別ですが)

そういうわけで、関数の戻り値で他に渡しても構いませんし、free()する必要はありません。
    • good
    • 0
この回答へのお礼

ダブルクォートで作成した文字列は動作環境によって適切な領域に保持されるんですね。
ありがとうございました。

お礼日時:2010/04/30 02:50

文字列がリテラルの場合、生存期間は、プログラムをメモリに読み込んだ時点から、


プログラム終了時までです。

リテラルをfreeしたりしちゃいけませんよ。
プログラム終了時に、自動的に開放されます。
    • good
    • 0
この回答へのお礼

ダブルクォートで作成した文字列はずっと保持されるのですね・・、知りませんでした。

お礼日時:2010/04/30 02:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!