文字列のメモリ保持期間とポインタについてわからないので教えてください。
よくポインタの説明に、文字列を使った下記のようなサンプルコードが紹介されます。
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しないといけない、なんて記述も見たことがなくよく理解できずにいます。
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
場合によります。
>char* s;
>s = "abcdefg";
>この"abcdefg"により確保された領域がいつまで保持されるのかわかりません。
>・これを実行しているメソッドを抜けるまでなのか?
>・free(s)するまでなのか?(free(s)しなければいけないのか?)
この場合は、プログラムがメモリにロードされた時点でメモリ上に"abcdefg"が配置され、
その先頭アドレスを char型のポインタ変数sに代入しているだけです。
# 「文字列リラテル」で検索されるとよいでしょう。
で、メモリ上に配置され"abcdefg"は、プログラムが終了するまで有効ですから解放する必要はありません。
# ちなみに「定数」扱いになりますので普通は書き換えできません。
>オブジェクトを生成して、そのメンバ変数に
>obj1->field1 = "value";
>というように格納して利用する
実装にもよりますが…たいていクラス内で「内容を変更する」必要がある場合は、領域を確保して「コピー」しているかと。
free()が必要なのは、malloc()やcalloc()等で明示的に確保した場合…になります。
標準関数でどの程度あるかは不明ですが…
「呼び出し元が解放の責任を負う」という作りの関数を使用した場合は、当然free()は必要ですが。
# strdup()とか。
ダブルクォートで作成した文字列は静的な定数として扱うんですね。
文字列の内容を変更するような場合には、メモリを確保してそこに内容をコピーしてから使用するというのは初耳でした。
No.3
- 回答日時:
> この"abcdefg"により確保された領域がいつまで保持されるのかわかりません。
"abcdefg"は文字列リテラルとしてソースコードに直書きされています。
こういうものはプログラムがメモリ上にロードされた時に、静的なメモリ空間に割り当てられます。
(PCだと実行時にRAM上にロードされますが、マイコン用の組み込みソフトなどではROM上のメモリ空間に割り当てられることもあります)
したがって、このメモリ領域はプログラムが実行された時から終了するまで保持されます。
もっとも、"abcdefg"はずっと存在しますが、それを指してるポインタ変数「s」はローカル変数なので、関数を抜けた時点で消滅します。(static宣言されている場合は別ですが)
そういうわけで、関数の戻り値で他に渡しても構いませんし、free()する必要はありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
C++で、メンバもヒープに確保さ...
-
C言語 mallocとfreeについて
-
ヒープメモリの解放について
-
アセンブラでのメモリの動的確...
-
HEAP に関すること
-
c言語のmalloc関数と2次元配列...
-
callocの処理速度
-
C++のnewで確保したメモリーの...
-
指定したメモリアドレスの値の...
-
CreateFileMapping について
-
配列の添え字の最大数とは?
-
C言語に関する質問
-
mallocについて
-
newしないオブジェクトについて
-
MFCのCStringについて
-
new と malloc によるメモリの...
-
16進ダンプのプログラム
-
malloc呼び出し時のセグメンテ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
newしないオブジェクトについて
-
ヒープメモリの解放について
-
stringの最大サイズ
-
void*型のデータサイズ
-
ビットをローテートするプログ...
-
malloc呼び出し時のセグメンテ...
-
スタック破壊の上手な見つけ方...
-
C++のnewで確保したメモリーの...
-
配列の添え字の最大数とは?
-
プログラムが途中で強制終了し...
-
DLLのマルチスレッドの動作につ...
-
mallocで確保するメモリの領域...
-
free関数で動作が止まる
-
グローバル変数のサイズ
-
デストラクタを呼びたい
-
malloc でのメモリ取得状況の可...
-
メモリ不足になってしまう。
-
HEAP に関すること
おすすめ情報