アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語です。
使用環境はμITRONです。

つい最近、今まで見かけたことのないコードを見まして
それが、正しく動作するのか教えて頂きたく考えております。

コードは下記の通りです。

/****************************************/
void aaa( void )
{
  char *bbb = NULL;

  if(dog > cat)
  {
    bbb = "あいうえお";
  }
  else
  {
    bbb = "かきくけこ";
  }

  ccc(bbb);
}

このif-elseブロック内で確保される"あいうえお"文字列や"かきくけこ"文字列の
アドレスの有効範囲はどこになるのでしょうか?

if-elseブロック内でしょうか?
それともaaa()関数内でしょうか?

勉強不足で申し訳ありませんが、よろしくお願い致します。

また、その後学のためにその根拠(参考文献や考え方など)も教えて頂ければなお有難いです。

A 回答 (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段落に依れば,「その生存期間はプログラム実行の全体とする」と定められています。


ただし,コンパイラが標準に準拠していない場合,以上の話は成り立ちません。
コンパイラのマニュアルを調査する必要があります。
    • good
    • 0
この回答へのお礼

言葉の定義まで指摘して頂き有難うございます。
完全に認識不足でした。。

章番号も非常に助かります。
有難うございました!

お礼日時:2013/01/07 21:52

"あいうえお"と"かきくけこ"は文字列定数ですので生存期間はstaticと同じです。

つまり、プログラムと同一の生存期間となります。アドレスも、その期間だけ有効です。

根拠は規格書を見てもらうぐらいしかないですね。
「日本工業標準調査会:データベース-JIS詳細表示 JISX3010 プログラム言語C」
http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D …
オンライン閲覧のみ可。
    • good
    • 0
この回答へのお礼

生存期間の説明だけでなく規格書のリンクまで
記載して頂き有難うございます。
非常に助かりました!

お礼日時:2013/01/07 21:55

文字列リテラルは static な char の配列なのでアドレスそのものはプログラム全体で有効.

    • good
    • 0
この回答へのお礼

有難うございます。
勉強になりました!

お礼日時:2013/01/07 21:48

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