C言語です。
使用環境はμITRONです。
つい最近、今まで見かけたことのないコードを見まして
それが、正しく動作するのか教えて頂きたく考えております。
コードは下記の通りです。
/****************************************/
void aaa( void )
{
char *bbb = NULL;
if(dog > cat)
{
bbb = "あいうえお";
}
else
{
bbb = "かきくけこ";
}
ccc(bbb);
}
このif-elseブロック内で確保される"あいうえお"文字列や"かきくけこ"文字列の
アドレスの有効範囲はどこになるのでしょうか?
if-elseブロック内でしょうか?
それともaaa()関数内でしょうか?
勉強不足で申し訳ありませんが、よろしくお願い致します。
また、その後学のためにその根拠(参考文献や考え方など)も教えて頂ければなお有難いです。
No.2ベストアンサー
- 回答日時:
まず,言葉の定義から。
・有効範囲 (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段落に依れば,「その生存期間はプログラム実行の全体とする」と定められています。
ただし,コンパイラが標準に準拠していない場合,以上の話は成り立ちません。
コンパイラのマニュアルを調査する必要があります。
No.3
- 回答日時:
"あいうえお"と"かきくけこ"は文字列定数ですので生存期間はstaticと同じです。
つまり、プログラムと同一の生存期間となります。アドレスも、その期間だけ有効です。根拠は規格書を見てもらうぐらいしかないですね。
「日本工業標準調査会:データベース-JIS詳細表示 JISX3010 プログラム言語C」
http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D …
オンライン閲覧のみ可。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- その他(データベース) カラム上の重複を削除するクエリを教えてください 3 2022/04/12 14:11
- Visual Basic(VBA) 【VBA】特定の文字で改行(次の行)に行きたい。 3 2022/04/11 17:20
- Visual Basic(VBA) Excel VBAでAA(BBB) → BBB.AA に置換したい 2 2022/10/30 13:59
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
- Excel(エクセル) VBAで “:” を含むセルの特定 2 2023/05/11 16:30
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Visual Basic(VBA) VBAの繰り返し処理について教えてください。 3 2022/08/02 13:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
VBAでの Replace関数で、ワイル...
-
文字列からタブコードを取り除...
-
Excelで3E8を3.00E+8にしない方...
-
【Excel VBA】複数ある特定の文...
-
MS SQLServer のSQLで文字列の...
-
エクセル 数値データを桁をそ...
-
Excelで指数表現しないようにす...
-
VBの「As String * 128」とは?
-
エクセルで文字列の最大値を抽...
-
同一セル内に関数と文字列を同...
-
エクセルで文字列をtxtファイル...
-
ORCLEでの小数の表示方法の変更...
-
Left関数とRight関数を合わせた...
-
Pro c/c++ でホスト変数の後に....
-
VBscriptからバッチに変数を渡...
-
Excelはなんで先頭の0を消すん...
-
16進数を10進数に簡単に変換す...
-
【COBOL】文字列から数値項目に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
文字列からタブコードを取り除...
-
Excelで3E8を3.00E+8にしない方...
-
VBAでの Replace関数で、ワイル...
-
Excelで指数表現しないようにす...
-
[C言語]fputsとfprintfの違い
-
エクセルで文字列をtxtファイル...
-
同一セル内に関数と文字列を同...
-
エクセルで文字列の最大値を抽...
-
Excelはなんで先頭の0を消すん...
-
MS SQLServer のSQLで文字列の...
-
エクセル 数値データを桁をそ...
-
Left関数とRight関数を合わせた...
-
VBA2005 16進を2桁で表示したい。
-
VBの「As String * 128」とは?
-
Msgboxの×が押されたとき
-
sedなどで、特定の文字列の後の...
-
【Excel VBA】複数ある特定の文...
-
OnTime 使用時のプロシージャへ...
おすすめ情報