タグ

文字列リテラルに関するyowanoのブックマーク (2)

  • 文字列リテラル - mkubara.com

    概要 C/C++でよく記述する、ダブルクォーテーションで囲まれた文字列を文字列リテラルと呼び、プログラム実行時に利用する文字列を表現するために利用します。文字列リテラルは普段何気なく使っているにもかかわらず、その実装はなかなかに興味深いものです。稿はそれを記述していきます。 文字列リテラル 文字列リテラルとは C/C++ではダブルクォーテーションで囲まれた文字列を文字列リテラルと呼びます。リテラルとは質的には定数を表します。(定数として実装されているかは実装系依存です) コード: 文字列リテラル 文字列リテラルはプログラム実行開始時に、メモリ領域中の特殊な領域に文字配列として確保されます。よって領域定義としては char [] に近いものです。ただし我々が普段使っているスタック領域(関数内で変数宣言したときに使う)やヒープ領域(newやmallocで取得する領域)とは違った箇所に領域を

    yowano
    yowano 2014/01/06
    規格上、文字列リテラルの書き換えは未定義とされているが、文字列リテラルは char * で受けることができてしまうため、容易に書き換えられてしまう。書き換えた場合は予期しないエラーが発生する。
  • 文字列のメモリ保持期間とポインタについての疑問 - OKWAVE

    場合によります。 >char* s; >s = "abcdefg"; >この"abcdefg"により確保された領域がいつまで保持されるのかわかりません。 >・これを実行しているメソッドを抜けるまでなのか? >・free(s)するまでなのか?(free(s)しなければいけないのか?) この場合は、プログラムがメモリにロードされた時点でメモリ上に"abcdefg"が配置され、 その先頭アドレスを char型のポインタ変数sに代入しているだけです。 # 「文字列リラテル」で検索されるとよいでしょう。 で、メモリ上に配置され"abcdefg"は、プログラムが終了するまで有効ですから解放する必要はありません。 # ちなみに「定数」扱いになりますので普通は書き換えできません。 >オブジェクトを生成して、そのメンバ変数に >obj1->field1 = "value"; >というように格納して利用する

    文字列のメモリ保持期間とポインタについての疑問 - OKWAVE
    yowano
    yowano 2014/01/02
    文字列リテラルは、プログラム終了時まで保存される。char* str = "abcde"; このstrは、文字列リテラルの先頭アドレスを持っているだけ。strの寿命と文字列リテラルの寿命は相関がない。
  • 1