- ベストアンサー
文字列のスコープについて教えてください
- C言語で文字列のスコープについて教えてください。使用環境はμITRONです。
- コード内で確保される文字列のアドレスの有効範囲は、if-elseブロック内ですか?それともaaa()関数内ですか?
- 参考文献や考え方を教えて頂けると助かります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
まず,言葉の定義から。 ・有効範囲 (scope) その識別子が利用可能である,領域の範囲。 関数有効範囲 (function scope),ファイル有効範囲 (file scope),ブロック有効範囲 (block scope),関数原型有効範囲 (function prototype scope) の4種類がある ISO/IEC 9899:1999 (以下 IS) 6.2.1 Scopes of identifiers JIS X 3010:2003 (以下,JIS) 6.2.1 識別子の有効範囲 ・記憶域期間 (storage duration) そのオブジェクトの生存期間の範囲。 静的記憶域期間 (static storage duration),自動記憶域期間 (automatic storage duration),割付け記憶域期間 (allocated storage duratoin) の3種類がある IS 6.2.4 Storage durations of objects JIS オブジェクトの記憶域期間 文字列リテラルは識別子がないですから,有効範囲はありません。 IS 6.4.5 String literals (JIS 6.4.5 文字列リテラル) の第5段落において,文字列リテラルは静的記憶域期間を持つ,と定められています。 # 正確には「文字列リテラル又はその並びから得られる多バイト文字の並び」が静的記憶域期間を持ちます。 なお,静的記憶域期間はIS/JIS 6.2.4の第3段落に依れば,「その生存期間はプログラム実行の全体とする」と定められています。 ただし,コンパイラが標準に準拠していない場合,以上の話は成り立ちません。 コンパイラのマニュアルを調査する必要があります。
その他の回答 (2)
- zwi
- ベストアンサー率56% (730/1282)
"あいうえお"と"かきくけこ"は文字列定数ですので生存期間はstaticと同じです。つまり、プログラムと同一の生存期間となります。アドレスも、その期間だけ有効です。 根拠は規格書を見てもらうぐらいしかないですね。 「日本工業標準調査会:データベース-JIS詳細表示 JISX3010 プログラム言語C」 http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3010 オンライン閲覧のみ可。
お礼
生存期間の説明だけでなく規格書のリンクまで 記載して頂き有難うございます。 非常に助かりました!
- Tacosan
- ベストアンサー率23% (3656/15482)
文字列リテラルは static な char の配列なのでアドレスそのものはプログラム全体で有効.
お礼
有難うございます。 勉強になりました!
お礼
言葉の定義まで指摘して頂き有難うございます。 完全に認識不足でした。。 章番号も非常に助かります。 有難うございました!