C言語なら俺に聞け 163 (987レス)
C言語なら俺に聞け 163 http://mevius.5ch.net/test/read.cgi/tech/1721137434/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
261: デフォルトの名無しさん (ワッチョイ d6f5-K4S3) [sage] 2024/09/24(火) 19:39:49.05 ID:tv/lKhnI0 >>174 > char* foo = "hoge"; > > のようなケースではポインタ foo は文字列リテラルを指してる (単に端折っただけかもしれないけれど、)文字列リテラルに関してCには非常に込み入った事情(Rationale Rev. 5.10 6.4.5 冒頭-l.26, N1256 Annex J.5.5)があり、厳密に言えば foo は "hoge" によって初期化された無名の配列を指している(N1256 6.7.8-32)。 C99RationaleV5.10 https://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf テンプレ入りキボンヌ >>皆の衆 ともあれ、込み入った事情に該当しなければ const char afoo[] = "hoge"; あるいは const char * const ccfoo = "hoge"; 場合によって const char *cfoo = "hoge"; と書いて、うっかり書き換え防止に勇往邁進するのじゃ。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/261
262: 261 (ワッチョイ d6f5-K4S3) [sage] 2024/09/24(火) 19:51:57.01 ID:tv/lKhnI0 >>158 件の意味論は 6.7.8-32 を介して 6.7.8-14,15 に帰結するように思われる一方で、文字列リテラルが 6.4.5-5 で自ら初期化した(やはり)無名の配列の代名詞だとすると 6.7.8-11 が適用されるという解釈も成り立ちそう。 char *gfoo1 = "hoge"; // (1) char *gfoo2 = "hoge"; // (2) void f() { char *foo1 = "hoge"; // (3) char *foo2 = "hoge"; // (4) } >>261 で触れた文字列リテラル書き換え派の場合、(1)〜(4)は別物なので、各々初期化しなければならないため前者の解釈。この時、(3), (4)が automatic storage duration でも良いように 6.7.8-32 では storage duration を定めていないのだと思う。 他方、文字列リテラル不変派の場合、(1)〜(4)は同一で良いので、初期化を一回で済ませて後者の解釈。 結局、前後者両方の解釈が出来るようになっているように見える。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/262
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
1.440s*