!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/
C17
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf
C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf
C23 最新ドラフト
https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3047.pdf
C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/
※前スレ
C言語なら俺に聞け 162
https://mevius.5ch.net/test/read.cgi/tech/1698653580/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
探検
C言語なら俺に聞け 163
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 7bba-Lem2)
2024/07/16(火) 22:43:54.18ID:ZrsCjURC0108はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 65e8-hr+9)
2024/09/13(金) 10:12:57.71ID:9XTDQHQm0 C の仕様は抽象機械の動作として記述される。
抽象機械の動作をどのように実際の機械と対応させるかは自由で、見かけ上の動作が同じならどういう機械語になってもいい。
生成された機械語から言語仕様を理解しようとすべきではないよ。
低レイヤプログラミングするならどう対応付くか知る必要がある場合もあるのは否定しないけど……
抽象機械の動作をどのように実際の機械と対応させるかは自由で、見かけ上の動作が同じならどういう機械語になってもいい。
生成された機械語から言語仕様を理解しようとすべきではないよ。
低レイヤプログラミングするならどう対応付くか知る必要がある場合もあるのは否定しないけど……
109デフォルトの名無しさん (ブーイモ MM45-bJfQ)
2024/09/13(金) 10:23:10.52ID:OBSQyTYbM その抽象機械の定義はしょせん後付け
c言語のソースから生成されるマシン語の想像が付くようになるのはいいこと
c言語のソースから生成されるマシン語の想像が付くようになるのはいいこと
110デフォルトの名無しさん (ワッチョイ 6663-QZ+t)
2024/09/13(金) 10:25:26.12ID:y2ap91b60 C言語ハンドコンパイラ
111はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 65e8-hr+9)
2024/09/13(金) 11:25:36.89ID:9XTDQHQm0112デフォルトの名無しさん (ワッチョイ a510-IFMZ)
2024/09/13(金) 11:46:29.60ID:HT/On1VB0 所詮部外者の推測。
113デフォルトの名無しさん (ワンミングク MM7a-k+ON)
2024/09/13(金) 12:46:10.11ID:CiewPVvpM 今日は患者が多いですね
114デフォルトの名無しさん (ブーイモ MM45-bJfQ)
2024/09/13(金) 12:53:56.59ID:OBSQyTYbM117はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-hr+9)
2024/09/13(金) 14:32:38.41ID:7dvxgxgq0 この場合に限っては言語仕様としての理屈もあんまり違わんけどな。
ただ、正式な用語を知ってると細かいことを調べやすいみたいなのはあるので便利。
ただ、正式な用語を知ってると細かいことを調べやすいみたいなのはあるので便利。
118デフォルトの名無しさん (JP 0H3e-voeu)
2024/09/13(金) 16:10:44.34ID:HymUJJD5H gccは配列に確保した短い文字列は最適化無しでもレジスターに載せてしまってるな
ポインター文字列は最適化してもレジスターには載らない
なので配列は配列として使った方が最適化で高速化される可能性があるという事だな
ポインター文字列は最適化してもレジスターには載らない
なので配列は配列として使った方が最適化で高速化される可能性があるという事だな
119はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-IU9Y)
2024/09/13(金) 16:26:39.79ID:7dvxgxgq0 ポインター文字列って変な言葉だな。
この場の造語だと思うけど
char *foo = "bar";
みたいなやつのことだよね?
文字列リテラルは静的記憶域期間 (寿命はプログラムの最初から最後まで) を持つオブジェクト。
どこかにある文字列をポインタで指しているという状況。
そのどこかにある文字は他のどこかから指し示されることもありうるので簡単には消えられない。
その一方で、配列の初期化子は配列を初期化する以外に使われる可能性がない。
この場の造語だと思うけど
char *foo = "bar";
みたいなやつのことだよね?
文字列リテラルは静的記憶域期間 (寿命はプログラムの最初から最後まで) を持つオブジェクト。
どこかにある文字列をポインタで指しているという状況。
そのどこかにある文字は他のどこかから指し示されることもありうるので簡単には消えられない。
その一方で、配列の初期化子は配列を初期化する以外に使われる可能性がない。
120デフォルトの名無しさん (アウアウエー Sa52-t/33)
2024/09/13(金) 16:36:31.22ID:bblj+c3pa121デフォルトの名無しさん (アウアウエー Sa52-t/33)
2024/09/13(金) 16:38:54.03ID:bblj+c3pa122デフォルトの名無しさん (JP 0H3e-voeu)
2024/09/13(金) 17:26:56.71ID:HymUJJD5H >>119
んなこたーない
char foo[] = "hoge";
char* bar = &foo[1]; /* 敢えてずらしてみる */
printf("bar -> %s\n", bar);
で中身は何度も参照されるぞ
gccで試してみたら敢えてずらしてポインターに代入されたとしても、レジスターに文字列を保持したままprintfに渡すというトリッキーなコードが生成されたw
スタックに文字列を書き込んでそのアドレスを渡してるっぽい
んなこたーない
char foo[] = "hoge";
char* bar = &foo[1]; /* 敢えてずらしてみる */
printf("bar -> %s\n", bar);
で中身は何度も参照されるぞ
gccで試してみたら敢えてずらしてポインターに代入されたとしても、レジスターに文字列を保持したままprintfに渡すというトリッキーなコードが生成されたw
スタックに文字列を書き込んでそのアドレスを渡してるっぽい
123デフォルトの名無しさん (JP 0H3e-voeu)
2024/09/13(金) 17:45:50.36ID:HymUJJD5H 短い配列文字列をポインターに代入したらレジスターに保持する最適化を諦めるかと思ったら、そうじゃなくて意地でもレジスターに保持したまま処理を進めるgccスゲーよw
clangの場合はポインターも配列も常に静的に文字列を定義したものを使ってた
clangの場合はポインターも配列も常に静的に文字列を定義したものを使ってた
124デフォルトの名無しさん (ワッチョイ 6663-QZ+t)
2024/09/13(金) 18:12:32.57ID:y2ap91b60 最近のCPUはレジスターに文字列格納できるんだな
何バイトくらいなら入るんだろうか
何バイトくらいなら入るんだろうか
125デフォルトの名無しさん (JP 0H3e-voeu)
2024/09/13(金) 18:26:19.17ID:HymUJJD5H gccの場合だと64bitだと8バイトだから最大7文字かなと思ったらレジスターを複数使ってでも載せようとしてたw
取り敢えず50文字まで試したけど全部レジスタに載ってた
でもこの辺はレジスタの空き具合にもよるのか?詳しくは分からん
取り敢えず50文字まで試したけど全部レジスタに載ってた
でもこの辺はレジスタの空き具合にもよるのか?詳しくは分からん
126デフォルトの名無しさん (ワッチョイ 6663-QZ+t)
2024/09/13(金) 18:41:27.03ID:y2ap91b60 何か執念みたいなのを感じました笑
127デフォルトの名無しさん (JP 0H3e-voeu)
2024/09/13(金) 18:50:06.89ID:HymUJJD5H スマン…間違えた…orz
正確にはアセンブリコードに書かれてると言うべきだった
movabsq $3833745473465760056, %rdx
movabsq $3978425819141910832, %rax
movq %rdx, 40(%rsp)
movabsq $3544395820347831604, %rdx
movq %rdx, 56(%rsp)
↑こんな感じで文字列が直値で表現されてて、スタックに積んで使ってた
だったら静的に確保した方が速い気がするけど、やっぱりレジスターから直接使う事が有るのか?
取り敢えずコンパイラーが出力するコードに深入りしない方が良いって事は分かったw
正確にはアセンブリコードに書かれてると言うべきだった
movabsq $3833745473465760056, %rdx
movabsq $3978425819141910832, %rax
movq %rdx, 40(%rsp)
movabsq $3544395820347831604, %rdx
movq %rdx, 56(%rsp)
↑こんな感じで文字列が直値で表現されてて、スタックに積んで使ってた
だったら静的に確保した方が速い気がするけど、やっぱりレジスターから直接使う事が有るのか?
取り敢えずコンパイラーが出力するコードに深入りしない方が良いって事は分かったw
128はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-IU9Y)
2024/09/13(金) 18:59:17.17ID:7dvxgxgq0129デフォルトの名無しさん (ワッチョイ 65cd-RtM0)
2024/09/13(金) 20:11:25.22ID:ykZRrldI0 速度の最適化か、生成されるオブジェクトの小ささかのトレードオフなんだろうね
テスト用のコードは小さいから、後者は気にせずゴリゴリやってるのかな…
テスト用のコードは小さいから、後者は気にせずゴリゴリやってるのかな…
131デフォルトの名無しさん (ワッチョイ fa2d-2PHd)
2024/09/13(金) 23:38:57.27ID:uRdGeQ4y0 世の中CやめてRustにしろだとか
OpenAIの新AIが競プロで上位1割のプログラマに匹敵とか言うじゃない
今更人間がCを続ける意義ってなんなんだろう
OpenAIの新AIが競プロで上位1割のプログラマに匹敵とか言うじゃない
今更人間がCを続ける意義ってなんなんだろう
132デフォルトの名無しさん (ワッチョイ 714e-/njq)
2024/09/14(土) 00:03:48.69ID:UIMFiyQN0 COBOLみたくロストテクノロジーを理解出来る貴重な人になれる
133はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-hr+9)
2024/09/14(土) 00:19:19.91ID:N2YvcTj50 低レイヤに関わる資料が C を前提に書かれていたりするのは普通のことなのでたとえ C でプログラミングしなくてもある程度は身に付いてないと困ることはあるだろう。
134デフォルトの名無しさん (ワッチョイ a6e1-865n)
2024/09/14(土) 00:39:08.66ID:0gsw2riP0 >>128
初期化する以外に参照されてないってのはおかしいだろ
printfで中身が表示されてんだから
ポインター変数のbar経由で中身を参照してるけど、中身は初期化で渡された文字列そのものだ
そもそもリテラルが参照されてないという言い方もおかしい
リテラルは単なる定数の簡略表記に過ぎず、ソースコード上だけの用語だ
実行時に消えてると言いたいのか?
そんなわけない、全く消えてない
初期化する以外に参照されてないってのはおかしいだろ
printfで中身が表示されてんだから
ポインター変数のbar経由で中身を参照してるけど、中身は初期化で渡された文字列そのものだ
そもそもリテラルが参照されてないという言い方もおかしい
リテラルは単なる定数の簡略表記に過ぎず、ソースコード上だけの用語だ
実行時に消えてると言いたいのか?
そんなわけない、全く消えてない
135デフォルトの名無しさん (ワッチョイ 6663-QZ+t)
2024/09/14(土) 00:51:01.21ID:8t7wdnSS0136デフォルトの名無しさん (ワッチョイ 2a7c-9vXG)
2024/09/14(土) 08:27:14.72ID:QgTfRJpW0137はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-IU9Y)
2024/09/14(土) 08:59:02.76ID:N2YvcTj50 >>134
> printfで中身が表示
意味が解らん。
表示されてる中身というのは foo の中身であってリテラルじゃないだろ。
> リテラルは単なる定数の簡略表記
整数リテラルなどは右辺値だが文字列リテラルに限っては左辺値。
文字列リテラルは実行フェイズにおいてオブジェクトとしての性質を持つということ。 (抽象機械の上では。)
ただし、この文字列リテラルが型変換された結果によって生まれるポインタはアドレス定数の要件を満たす。
> printfで中身が表示
意味が解らん。
表示されてる中身というのは foo の中身であってリテラルじゃないだろ。
> リテラルは単なる定数の簡略表記
整数リテラルなどは右辺値だが文字列リテラルに限っては左辺値。
文字列リテラルは実行フェイズにおいてオブジェクトとしての性質を持つということ。 (抽象機械の上では。)
ただし、この文字列リテラルが型変換された結果によって生まれるポインタはアドレス定数の要件を満たす。
138デフォルトの名無しさん (ワッチョイ a6e1-865n)
2024/09/14(土) 10:32:56.64ID:0gsw2riP0139はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-IU9Y)
2024/09/14(土) 10:49:21.06ID:N2YvcTj50 >>138
前述の通り整数リテラルは右辺値 (rvalue)。
文字列リテラルは例外的な存在だ。
まず、 C の用語では「オブジェクト」と「値」は違う意味を持つ。
メモリ上のビットパターンがオブジェクトで、値は式の結果だ。
(規格用語では data storage だがここではあえてカジュアルな用語で言うことにする。)
そして式の結果は lvalue と rvalue に区分される。
オブジェクトに結び付いている値が lvalue だと考えていい。
個々に規定があるので詳細は割愛するが、
式の中で変数名だとか単項 * 演算だとか [] とかがあればそれはメモリ上に存在してるのは明白だろ?
そういうのが lvalue 。
たとえば 1+3+5 みたいな式があれば途中で 4 という値が生じるが、これは「どこ」にある?
場所に結び付いておらず、式が終われば破棄されることになってる。
こういうのが rvalue 。
ちなみに lvalue も rvalue が要求される文脈では rvalue に変換される。 (メモリから値が読みだされる。)
前述の通り整数リテラルは右辺値 (rvalue)。
文字列リテラルは例外的な存在だ。
まず、 C の用語では「オブジェクト」と「値」は違う意味を持つ。
メモリ上のビットパターンがオブジェクトで、値は式の結果だ。
(規格用語では data storage だがここではあえてカジュアルな用語で言うことにする。)
そして式の結果は lvalue と rvalue に区分される。
オブジェクトに結び付いている値が lvalue だと考えていい。
個々に規定があるので詳細は割愛するが、
式の中で変数名だとか単項 * 演算だとか [] とかがあればそれはメモリ上に存在してるのは明白だろ?
そういうのが lvalue 。
たとえば 1+3+5 みたいな式があれば途中で 4 という値が生じるが、これは「どこ」にある?
場所に結び付いておらず、式が終われば破棄されることになってる。
こういうのが rvalue 。
ちなみに lvalue も rvalue が要求される文脈では rvalue に変換される。 (メモリから値が読みだされる。)
140はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-IU9Y)
2024/09/14(土) 12:58:36.93ID:N2YvcTj50 >>138
このときの 1 というリテラルは (rvalue の) 1 を返す式で、その値が i にコピーされた後で寿命を終えて消滅する。
printf の引数の i で取り出される 1 は i に入っている 1 であってリテラルの 1 じゃない。
整数リテラルはあくまでも整数を返す (生成すると言ってもいいかも?) 式であって、メモリ上のどこかにあるオブジェクトというわけじゃない。
このときの 1 というリテラルは (rvalue の) 1 を返す式で、その値が i にコピーされた後で寿命を終えて消滅する。
printf の引数の i で取り出される 1 は i に入っている 1 であってリテラルの 1 じゃない。
整数リテラルはあくまでも整数を返す (生成すると言ってもいいかも?) 式であって、メモリ上のどこかにあるオブジェクトというわけじゃない。
141デフォルトの名無しさん (ワッチョイ a6e1-865n)
2024/09/14(土) 13:32:49.89ID:0gsw2riP0142はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-hr+9)
2024/09/14(土) 13:40:20.14ID:N2YvcTj50143デフォルトの名無しさん (ワッチョイ a6e1-865n)
2024/09/14(土) 13:43:47.04ID:0gsw2riP0144はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-hr+9)
2024/09/14(土) 13:55:39.65ID:N2YvcTj50145デフォルトの名無しさん (ワッチョイ 6663-QZ+t)
2024/09/14(土) 14:05:45.99ID:8t7wdnSS0 > char foo[] = "hoge";
> char* bar = &foo[1]; /* 敢えてずらしてみる */
> bar が参照しているのは文字列リテラルからコピーされた配列であって文字列リテラルではない。
説明がよく分からないが、barは、fooではなく、どこかにコピーした別の文字列なり配列を参照していると言うことか?
> char* bar = &foo[1]; /* 敢えてずらしてみる */
> bar が参照しているのは文字列リテラルからコピーされた配列であって文字列リテラルではない。
説明がよく分からないが、barは、fooではなく、どこかにコピーした別の文字列なり配列を参照していると言うことか?
146はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-IU9Y)
2024/09/14(土) 14:20:52.41ID:N2YvcTj50 >>145
bar はどうでもいいよ。 それは要らん間接参照を入れて例としてよくわからんようになってるから
飛び飛びになってる私の書いてることをあらためてまとめると
・ char foo[] = "hoge"; といったような記述があれば "hoge" によって foo を初期化する。
・ このときの文字列リテラル "hoge" は foo を初期化するだけに使われて他からアクセスされる可能性がない。
・ 言語規格の建前上は文字列リテラルの寿命はプログラムの最初から最後までだが……
・ この場合は他からアクセスされる可能性がないから機械語レベルでは文字列リテラルは最適化で消えて (即値としてコードに埋め込んで) も問題にならない。
bar はどうでもいいよ。 それは要らん間接参照を入れて例としてよくわからんようになってるから
飛び飛びになってる私の書いてることをあらためてまとめると
・ char foo[] = "hoge"; といったような記述があれば "hoge" によって foo を初期化する。
・ このときの文字列リテラル "hoge" は foo を初期化するだけに使われて他からアクセスされる可能性がない。
・ 言語規格の建前上は文字列リテラルの寿命はプログラムの最初から最後までだが……
・ この場合は他からアクセスされる可能性がないから機械語レベルでは文字列リテラルは最適化で消えて (即値としてコードに埋め込んで) も問題にならない。
147デフォルトの名無しさん (ブーイモ MM0a-bJfQ)
2024/09/14(土) 16:37:38.90ID:kHQOYHTcM148はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-hr+9)
2024/09/14(土) 16:47:20.53ID:N2YvcTj50149デフォルトの名無しさん (ワッチョイ 8af5-/VPw)
2024/09/14(土) 17:01:46.57ID:5H/bnNk90 最適化でどうなるかを考えながらC書くくらいならもうアセンブリ書いたほうが良いと思う
150デフォルトの名無しさん (ワッチョイ a6e1-865n)
2024/09/14(土) 17:07:34.51ID:0gsw2riP0 >>146
はちみつは文字列リテラルがアセンブリソースの段階で"hoge"と書かれてなければ消えてると思ってんだなw
例え命令コードの即値で書かれていても消えてる訳じゃないからー!残念!
だから話が噛み合わなかったんだw
まぁ強いて言えば、最適化でデータの表現法方を変えても構わないって言えば良い
はちみつは文字列リテラルがアセンブリソースの段階で"hoge"と書かれてなければ消えてると思ってんだなw
例え命令コードの即値で書かれていても消えてる訳じゃないからー!残念!
だから話が噛み合わなかったんだw
まぁ強いて言えば、最適化でデータの表現法方を変えても構わないって言えば良い
151デフォルトの名無しさん (ワッチョイ a6e1-865n)
2024/09/14(土) 17:14:48.19ID:0gsw2riP0 x = 1; ← 最適化で消えても構わない
x = 2;
最適化で消えても構わないってこういうことを言うんだよ
char foo[] = "hoge";
"hoge"は消えて良い訳ないだろw
gccは実際、命令コードに文字列を埋め込んでスタックに生成してるが、その文字列はポインター変数を使えば参照可能だ
x = 2;
最適化で消えても構わないってこういうことを言うんだよ
char foo[] = "hoge";
"hoge"は消えて良い訳ないだろw
gccは実際、命令コードに文字列を埋め込んでスタックに生成してるが、その文字列はポインター変数を使えば参照可能だ
152はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-IU9Y)
2024/09/14(土) 17:26:48.38ID:N2YvcTj50153はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-IU9Y)
2024/09/14(土) 17:33:13.32ID:N2YvcTj50 >>151
> 参照可能だ
その時参照してるのはスタック上にある配列であって、文字列リテラルではないってのを俺は何度書けばいいんだ?
文字列リテラルは本来は「プログラムの開始から終わりまでの寿命を持つオブジェクト」としてあらねばならないのが、
実際には文字列リテラルではない形になってることを「消えてる」と表現したのは確かに微妙な表現だったかもしれないが、
有るべき場所から消えてるんだからそんくらいわかるだろ。
そもそも最初は char* foo = "hoge"; との対比で言ってたんだから。
> 参照可能だ
その時参照してるのはスタック上にある配列であって、文字列リテラルではないってのを俺は何度書けばいいんだ?
文字列リテラルは本来は「プログラムの開始から終わりまでの寿命を持つオブジェクト」としてあらねばならないのが、
実際には文字列リテラルではない形になってることを「消えてる」と表現したのは確かに微妙な表現だったかもしれないが、
有るべき場所から消えてるんだからそんくらいわかるだろ。
そもそも最初は char* foo = "hoge"; との対比で言ってたんだから。
154デフォルトの名無しさん (ワッチョイ 8a56-/VPw)
2024/09/14(土) 18:13:05.20ID:5H/bnNk90 はちみつ餃子の説明はたぶん、C++ の考え方が混ざっていないか
C で配列の初期化子に文字列リテラルが書けるのはあくまで文字列リテラル限定であって、それは式として扱われるのではなく、lvalue も rvalue もクソもないということだと思うが
C で配列の初期化子に文字列リテラルが書けるのはあくまで文字列リテラル限定であって、それは式として扱われるのではなく、lvalue も rvalue もクソもないということだと思うが
155はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-IU9Y)
2024/09/14(土) 18:35:19.29ID:N2YvcTj50156デフォルトの名無しさん (ワッチョイ a6e1-865n)
2024/09/14(土) 18:53:38.72ID:0gsw2riP0 >>153
その配列に格納されているデータが文字列リテラルから生成された文字列(の実体)だろ
厳密に言いたいなら、文字列リテラルはコンパイル時に存在さえしてれば良いものなんだよ
何しろ「リテラル」だから
それを生存期間だの実行時の実体とごっちゃにしてるから訳分かんないことになんだよ
コンパイル時にさえ存在してれば良いという事を実行時には消えてても良いとか言っちゃってんでしょ?
その配列に格納されているデータが文字列リテラルから生成された文字列(の実体)だろ
厳密に言いたいなら、文字列リテラルはコンパイル時に存在さえしてれば良いものなんだよ
何しろ「リテラル」だから
それを生存期間だの実行時の実体とごっちゃにしてるから訳分かんないことになんだよ
コンパイル時にさえ存在してれば良いという事を実行時には消えてても良いとか言っちゃってんでしょ?
157デフォルトの名無しさん (ワッチョイ a6e1-865n)
2024/09/14(土) 19:03:33.67ID:0gsw2riP0 char foo[] = { 'h', 'o', 'g', 'e', 0 };
文字列リテラルは↑のシンタックスシュガーだ
初期化子は消えても構わないのか?
初期化子が生成した文字列は参照出来ないと言うのか?
文字列リテラルは↑のシンタックスシュガーだ
初期化子は消えても構わないのか?
初期化子が生成した文字列は参照出来ないと言うのか?
158デフォルトの名無しさん (ワッチョイ 8a56-/VPw)
2024/09/14(土) 19:10:37.88ID:5H/bnNk90 >>155
https://en.cppreference.com/w/c/language/array_initialization
ここ参考にしてたから文法定義の時点で式じゃないと思ってたけど、ちゃんと規格上は式としてのパースではあったね、すまない
改めて C99(でいいんだよね、6.7.8 ってことは)の draft 読んでみたけど、文字列リテラルで初期化できるのは 6.7.8.14,15 で特殊に定義された意味論であって、やっぱり式扱いじゃないんじゃないかね
https://en.cppreference.com/w/c/language/array_initialization
ここ参考にしてたから文法定義の時点で式じゃないと思ってたけど、ちゃんと規格上は式としてのパースではあったね、すまない
改めて C99(でいいんだよね、6.7.8 ってことは)の draft 読んでみたけど、文字列リテラルで初期化できるのは 6.7.8.14,15 で特殊に定義された意味論であって、やっぱり式扱いじゃないんじゃないかね
159はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-hr+9)
2024/09/14(土) 19:58:20.45ID:N2YvcTj50 >>154
結果的な挙動からするとどっちでも良いから書いてないだけかも。
結果的な挙動からするとどっちでも良いから書いてないだけかも。
160デフォルトの名無しさん (ワッチョイ 6663-QZ+t)
2024/09/14(土) 20:16:47.07ID:8t7wdnSS0 皆拘らずに使っているのに言うのもあれなんだが
C言語にはC++で言う参照はありません
C言語にはC++で言う参照はありません
161デフォルトの名無しさん (ワッチョイ a6b2-Z1Qu)
2024/09/14(土) 21:01:12.02ID:NQ2pFzob0 hogeは破棄されないって一人がんばってるID:0gsw2riP0を救済して差し上げたいが……自分も完全にわかってないのでできない。
162デフォルトの名無しさん (ワッチョイ 65cd-RtM0)
2024/09/14(土) 21:04:22.62ID:tDLmxNl+0 実在するのはfoo[]だけで
文字列"hoge"は破壊どころか最初からあっても無くてもいいというのがここまでにわかったことだろ
文字列"hoge"は破壊どころか最初からあっても無くてもいいというのがここまでにわかったことだろ
163デフォルトの名無しさん (ワッチョイ 7910-VVra)
2024/09/14(土) 22:15:49.35ID:zMI9sEnq0 配列と別に文字列もどこか別に確保しといて何の意味があるんだよ
この形で配列作る度に二倍メモリ食うことになるじゃないか
この形で配列作る度に二倍メモリ食うことになるじゃないか
164はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-IU9Y)
2024/09/14(土) 22:32:05.03ID:N2YvcTj50 >>163
せやで。 だから最適化の余地があるという話をしてる。
せやで。 だから最適化の余地があるという話をしてる。
165デフォルトの名無しさん (ワッチョイ 6663-QZ+t)
2024/09/14(土) 22:34:31.27ID:8t7wdnSS0 ここで最適化の話は混ぜない方が良い
166デフォルトの名無しさん (ワッチョイ a6e1-865n)
2024/09/14(土) 23:00:09.33ID:0gsw2riP0 >>163
clangは配列でも文字列リテラルは残ってるよ
ここって想像だけで語るアホばっかだなw
リテラルはコンパイル時のみに必要
それとは別に実行時にリテラルを実体化した値が存在する
基本的にrvalueだ
でないと当然初期化が出来ない
この値をはちみつは無視して語っている
clangは配列でも文字列リテラルは残ってるよ
ここって想像だけで語るアホばっかだなw
リテラルはコンパイル時のみに必要
それとは別に実行時にリテラルを実体化した値が存在する
基本的にrvalueだ
でないと当然初期化が出来ない
この値をはちみつは無視して語っている
167デフォルトの名無しさん (ワッチョイ a6e1-865n)
2024/09/14(土) 23:04:40.23ID:0gsw2riP0 はちみつはリテラルはコンパイル時にのみ必要な事と、実行時には必要な初期値(rvalue)を最適化で命令コードに埋め込む事を消えたと表現して、ごっちゃにしてるアホ
これが結論
これが結論
168デフォルトの名無しさん (ワッチョイ a6e1-865n)
2024/09/14(土) 23:11:36.67ID:0gsw2riP0 リテラルは参照されないと言ってるのがその証拠
そりゃコンパイル時にのみに必要なその場でデータ構造を表現するリテラルを、実行時に参照出来る訳ないだろw
それが出来るのはコードをデータとして表現してるLisp だけだ
C++のテンプレートでも無理
C++のconstevalなら可能になった
std::formatはそれで実装可能になった
実行時には初期化の為のrvalueが絶対に存在する
そりゃコンパイル時にのみに必要なその場でデータ構造を表現するリテラルを、実行時に参照出来る訳ないだろw
それが出来るのはコードをデータとして表現してるLisp だけだ
C++のテンプレートでも無理
C++のconstevalなら可能になった
std::formatはそれで実装可能になった
実行時には初期化の為のrvalueが絶対に存在する
169デフォルトの名無しさん (ワッチョイ a6e1-865n)
2024/09/14(土) 23:13:53.14ID:0gsw2riP0 constevalも文字列リテラルを参照可能なのはコンパイル時のみだった…
やっぱり真に実行時に文字列リテラルを参照可能なのはLisp だけだな
やっぱり真に実行時に文字列リテラルを参照可能なのはLisp だけだな
170デフォルトの名無しさん (ワッチョイ 8a56-/VPw)
2024/09/14(土) 23:40:13.14ID:5H/bnNk90 >>1 の C17 ドラフトのリンク C++17 のやつじゃん
次スレ立てるならこれに変えといて
https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf
次スレ立てるならこれに変えといて
https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf
171はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-IU9Y)
2024/09/14(土) 23:53:27.27ID:N2YvcTj50172デフォルトの名無しさん (ワッチョイ d7cd-qbvN)
2024/09/15(日) 00:57:56.19ID:/wZr5+b/0173デフォルトの名無しさん (ワッチョイ ffe1-1pYN)
2024/09/15(日) 01:17:55.27ID:STy65/7c0 >>171
> 実行フェイズに存在するオブジェクトだよ。
存在してんじゃねーかよ!
これが最適化で消えて良いかの話だよ!
gccの場合は命令コードに埋め込んでるけど、消えてる訳じゃないし、別のポインターから参照可能だ
> 実行フェイズに存在するオブジェクトだよ。
存在してんじゃねーかよ!
これが最適化で消えて良いかの話だよ!
gccの場合は命令コードに埋め込んでるけど、消えてる訳じゃないし、別のポインターから参照可能だ
174はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f732-vU+L)
2024/09/15(日) 01:30:47.17ID:B6k8li/O0 >>173
配列とその初期化子として現れる文字列リテラルが別の存在だってことが俺が何度も書いてることだよ。
これがそんなに何度も何度も何度も何度も書かないと理解できないようなことか?
別のポインタは配列を指せるが、その初期化子として現れる文字列リテラルを指せるわけじゃない。
char* foo = "hoge";
のようなケースではポインタ foo は文字列リテラルを指してるということと対比しての話だぞ。
配列とその初期化子として現れる文字列リテラルが別の存在だってことが俺が何度も書いてることだよ。
これがそんなに何度も何度も何度も何度も書かないと理解できないようなことか?
別のポインタは配列を指せるが、その初期化子として現れる文字列リテラルを指せるわけじゃない。
char* foo = "hoge";
のようなケースではポインタ foo は文字列リテラルを指してるということと対比しての話だぞ。
175デフォルトの名無しさん (ワッチョイ ffe1-1pYN)
2024/09/15(日) 01:32:35.13ID:STy65/7c0 ちなみに「文字列リテラル」が「実行時」に存在してる訳では全くない
はちみつはそこを勘違いしてる
静的記憶期間というのはスコープの事だ
まぁエクステントと言った方が正確だが
それはコンパイラーが理解できるものだが、それと「実行時」に存在する値を結びつけてはいけないし関係無い
DLLだとしたら静的記憶期間の変数も実行時には存在しない可能性もある
スレッドローカルストレージの変数もそうだな
要するに文字列リテラルで生成されたデータは実行時には確実にアクセス可能で、消えてるなんて全くあり得ない
それをずっと言ってる
はちみつはそこを勘違いしてる
静的記憶期間というのはスコープの事だ
まぁエクステントと言った方が正確だが
それはコンパイラーが理解できるものだが、それと「実行時」に存在する値を結びつけてはいけないし関係無い
DLLだとしたら静的記憶期間の変数も実行時には存在しない可能性もある
スレッドローカルストレージの変数もそうだな
要するに文字列リテラルで生成されたデータは実行時には確実にアクセス可能で、消えてるなんて全くあり得ない
それをずっと言ってる
176デフォルトの名無しさん (ワッチョイ ffe1-1pYN)
2024/09/15(日) 01:38:12.52ID:STy65/7c0 >>174
> 文字列リテラルを指せるわけじゃない。
はい、これが間違いの全て
文字列リテラルはコンパイラーだけが理解できる「構文」に過ぎない
それを実行時にさせないとはこれいかに?w
文字列リテラルは「実行時」には何て名前になってんだ?
配列でもないぞ
配列に代入される前のrvalueの事だ
まぁ文字列は例外的にlvalueにもなれるが、rvalueであることには違いない
> 文字列リテラルを指せるわけじゃない。
はい、これが間違いの全て
文字列リテラルはコンパイラーだけが理解できる「構文」に過ぎない
それを実行時にさせないとはこれいかに?w
文字列リテラルは「実行時」には何て名前になってんだ?
配列でもないぞ
配列に代入される前のrvalueの事だ
まぁ文字列は例外的にlvalueにもなれるが、rvalueであることには違いない
177デフォルトの名無しさん (ワッチョイ 9f56-3vlU)
2024/09/15(日) 01:45:15.62ID:hg9QOZOF0 >>171
なんかいろいろ書いたけど最終的には自分もそれで合っていると思う
実用上は正直どこで役に立つのかあまり思いつかないが、規格上どういう建て付けになってるのかはとりあえず理解できたかも
というか、実用上あんまり役に立つわけじゃないから今まで調べもしなかったというか
規格上は「リテラル」は存在せず integer/enumeration/floating/character は定数なんですね
それで定数は記憶域期間を持たない
文字列リテラルは静的記憶域期間を持つ
複合リテラルは関数本体の外か中かに応じて静的/自動記憶域期間を持つ、と
うーんでもなあ
某言語でいきなり &1 とか書けるの知ってたら別に定数にも記憶域期間持たせればいいじゃんとか思っちゃうなあ
とりあえずそうなっているというだけか
なんかいろいろ書いたけど最終的には自分もそれで合っていると思う
実用上は正直どこで役に立つのかあまり思いつかないが、規格上どういう建て付けになってるのかはとりあえず理解できたかも
というか、実用上あんまり役に立つわけじゃないから今まで調べもしなかったというか
規格上は「リテラル」は存在せず integer/enumeration/floating/character は定数なんですね
それで定数は記憶域期間を持たない
文字列リテラルは静的記憶域期間を持つ
複合リテラルは関数本体の外か中かに応じて静的/自動記憶域期間を持つ、と
うーんでもなあ
某言語でいきなり &1 とか書けるの知ってたら別に定数にも記憶域期間持たせればいいじゃんとか思っちゃうなあ
とりあえずそうなっているというだけか
178はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f732-vU+L)
2024/09/15(日) 01:46:17.50ID:B6k8li/O0 >>175
> 静的記憶期間というのはスコープの事
ちがう。 記憶域期間はオブジェクトの寿命の区分。
6.2.4 を参照のこと。
寿命の区分が設定されている以上はオブジェクト (メモリ上のどこかにある) のこと。
> 文字列リテラルで生成されたデータは実行時には確実にアクセス可能で、消えてるなんて全くあり得ない
関数 (C のプログラムは関数の集合なので実質的にプログラムの全て) はオブジェクトではない。
私が「消える」と表現したのはこの意識があったからだが、機械語のレベルでどこかには存在するという意味ではそりゃ存在するだろう。
(同じ内容が連続する配列だったらループで書き込むような形にすることもあるかもしれない。)
配列の初期化子としての文字列リテラルは本来あるべき場所 (オブジェクト) から最適化で消えてるし、ポインタで指すことは出来ない。
> 静的記憶期間というのはスコープの事
ちがう。 記憶域期間はオブジェクトの寿命の区分。
6.2.4 を参照のこと。
寿命の区分が設定されている以上はオブジェクト (メモリ上のどこかにある) のこと。
> 文字列リテラルで生成されたデータは実行時には確実にアクセス可能で、消えてるなんて全くあり得ない
関数 (C のプログラムは関数の集合なので実質的にプログラムの全て) はオブジェクトではない。
私が「消える」と表現したのはこの意識があったからだが、機械語のレベルでどこかには存在するという意味ではそりゃ存在するだろう。
(同じ内容が連続する配列だったらループで書き込むような形にすることもあるかもしれない。)
配列の初期化子としての文字列リテラルは本来あるべき場所 (オブジェクト) から最適化で消えてるし、ポインタで指すことは出来ない。
179はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f732-vU+L)
2024/09/15(日) 01:53:34.48ID:B6k8li/O0180デフォルトの名無しさん (ワッチョイ ffe1-1pYN)
2024/09/15(日) 01:58:39.53ID:STy65/7c0 >>178
> ちがう。 記憶域期間はオブジェクトの寿命の区分。
だからエクステントと書いてんだろ!
もしかして理解出来なかったか?
> 配列の初期化子としての文字列リテラルは本来あるべき場所 (オブジェクト) から最適化で消えてるし
本来あるべき場所(オブジェクト)って何だよ?!
目茶苦茶だなw
これがコンパイラーと実行時に存在すべき値(rvalue)をごっちゃにした成れの果てだなw
> ちがう。 記憶域期間はオブジェクトの寿命の区分。
だからエクステントと書いてんだろ!
もしかして理解出来なかったか?
> 配列の初期化子としての文字列リテラルは本来あるべき場所 (オブジェクト) から最適化で消えてるし
本来あるべき場所(オブジェクト)って何だよ?!
目茶苦茶だなw
これがコンパイラーと実行時に存在すべき値(rvalue)をごっちゃにした成れの果てだなw
181デフォルトの名無しさん (ワッチョイ ffe1-1pYN)
2024/09/15(日) 02:33:43.11ID:STy65/7c0 初期化に使われた(文字列)リテラルが実行時にrvalueになったものに名前を付けるべきだな
これは最適化でも消えることはない(当たり前だが…)
名前がないとまたリテラルは消えるから参照出来ない野郎が発生しかねないw
これは最適化でも消えることはない(当たり前だが…)
名前がないとまたリテラルは消えるから参照出来ない野郎が発生しかねないw
182デフォルトの名無しさん (スッップ Sdbf-2MD7)
2024/09/15(日) 12:24:08.15ID:WkBCL5VYd >>174
>char* foo = "hoge";
>
>のようなケースではポインタ foo は文字列リテラルを指してる
その表現が間違ってる。
fooは静的記憶域を指してるが正しい。
intptr_t *bar = 0xAABB;
この場合数値リテラルを指すなんて言わんだろ。
>char* foo = "hoge";
>
>のようなケースではポインタ foo は文字列リテラルを指してる
その表現が間違ってる。
fooは静的記憶域を指してるが正しい。
intptr_t *bar = 0xAABB;
この場合数値リテラルを指すなんて言わんだろ。
>>char* foo = "hoge";
>>
>>のようなケースではポインタ foo は文字列リテラルを指してる
>
>その表現が間違ってる。
>fooは静的記憶域を指してるが正しい。
彼も文字列リテラルは静的記憶域に置かれると言ってなかったっけ
僕にはこの2つの違いが分からないや
勘違いだったらごめんなさい
>>
>>のようなケースではポインタ foo は文字列リテラルを指してる
>
>その表現が間違ってる。
>fooは静的記憶域を指してるが正しい。
彼も文字列リテラルは静的記憶域に置かれると言ってなかったっけ
僕にはこの2つの違いが分からないや
勘違いだったらごめんなさい
184デフォルトの名無しさん (ブーイモ MM8f-GITO)
2024/09/15(日) 16:04:15.59ID:7leD3hDGM もっと中身のある話しようぜ
185デフォルトの名無しさん (ワッチョイ 9794-z7on)
2024/09/15(日) 17:53:23.56ID:V70NGKYC0186デフォルトの名無しさん (スプッッ Sd3f-2MD7)
2024/09/15(日) 18:13:20.02ID:/tCGodXOd それだな
187デフォルトの名無しさん (ワッチョイ d7cd-qbvN)
2024/09/15(日) 21:42:32.09ID:/wZr5+b/0 ちなみに
int main(int argc, char *argv[])
と定義しても
argvは++できる
int main(int argc, char *argv[])
と定義しても
argvは++できる
188デフォルトの名無しさん (ワッチョイ ff63-y7MN)
2024/09/15(日) 23:27:23.69ID:dUpBu3ui0 main の引数だけど、人によって好みがある
*argv[]だったり、 **argvだったり、
さすがにargv[][]はいないと思う
*argv[]だったり、 **argvだったり、
さすがにargv[][]はいないと思う
189はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f732-vU+L)
2024/09/16(月) 08:22:23.81ID:JwEVxA0h0190はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f732-vU+L)
2024/09/16(月) 08:28:07.90ID:JwEVxA0h0 >>182-183
静的記憶域期間ってのは静的+記憶域期間なんだよ。 静的記憶域+期間じゃないんだよ。
まあ静的記憶域期間を持つオブジェクトが配置されている場所を静的記憶域と呼んでもカジュアルな場面ではそんなに不自然ではないとは思うけど。
実装上は専用のセクションに配置するのが普通だし。
静的記憶域期間ってのは静的+記憶域期間なんだよ。 静的記憶域+期間じゃないんだよ。
まあ静的記憶域期間を持つオブジェクトが配置されている場所を静的記憶域と呼んでもカジュアルな場面ではそんなに不自然ではないとは思うけど。
実装上は専用のセクションに配置するのが普通だし。
191デフォルトの名無しさん (ワッチョイ 776e-SKTh)
2024/09/16(月) 08:30:39.50ID:+a4Swf1f0 ここまでのまとめ
Cは生産性が低い
C使いも生産性が低い
Cは生産性が低い
C使いも生産性が低い
192デフォルトの名無しさん (ワッチョイ ff63-y7MN)
2024/09/16(月) 10:51:57.39ID:yKwOC4kA0 ID:+a4Swf1f0 は、言語に何使おうと生産性が低そう
193デフォルトの名無しさん (ワッチョイ ff2a-48Tr)
2024/09/16(月) 11:29:42.22ID:0nzerU0W0194デフォルトの名無しさん (ワッチョイ 1751-z7on)
2024/09/16(月) 12:43:08.20ID:T6H9+ne50 >>189
変更可能な左辺値に配列型は含まれないからそれとは違うん?いつポインタに型変換されてんの?
変更可能な左辺値に配列型は含まれないからそれとは違うん?いつポインタに型変換されてんの?
195はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f732-vU+L)
2024/09/16(月) 13:26:14.08ID:JwEVxA0h0 >>194
6.3.2.1 より
> 左辺値がsizeof演算子のオペランド,単項&演算子のオペランド,又は文字配列を初期化するのに使われる文字列リテラルである場合を除いて,
> 型“〜型の配列”をもつ式は,型“〜型へのポインタ”の式に型変換する。
式として出てくる配列は一部の例外を除けば問答無用で変換されるので ++ のオペランドに配列が出てくるときも変換後のポインタ (rvalue) に対する演算 (実際には出来ないけど) として解釈されるということでいいと思う。
6.3.2.1 より
> 左辺値がsizeof演算子のオペランド,単項&演算子のオペランド,又は文字配列を初期化するのに使われる文字列リテラルである場合を除いて,
> 型“〜型の配列”をもつ式は,型“〜型へのポインタ”の式に型変換する。
式として出てくる配列は一部の例外を除けば問答無用で変換されるので ++ のオペランドに配列が出てくるときも変換後のポインタ (rvalue) に対する演算 (実際には出来ないけど) として解釈されるということでいいと思う。
196デフォルトの名無しさん (ワッチョイ 1751-z7on)
2024/09/16(月) 14:56:21.22ID:T6H9+ne50197はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f732-vU+L)
2024/09/16(月) 16:28:24.01ID:JwEVxA0h0 >>196
C には配列の要素を指すポインタとは別に配列を指すポインタというものもある。
こんなことが出来る。
int foo[10];
int (*bar)[10] = &foo;
このときの bar の型は int(*)[10] ということになるわけだが……。
型情報として長さが含まれるのはかえって邪魔だ。
大抵の配列を受け取る関数 (str系やmem系など) は配列の大きさが固定ではないから。
配列の先頭要素で配列を代表させる (それが簡単な記法にする) ほうが都合がよかったんじゃないかと思う。
配列全体をひとつの値として扱いたい場合のほうが少ないだろうという判断もそれなりに合理的じゃないかな。
いまどきの言語 (Go とか Rust とか) は範囲を表すスライスという概念を導入して解決してるけど、
C の登場時期だと 2 ワードのオブジェクトを基本型にするのってなんかヤじゃない? と思ったとしても仕方ない。
C には配列の要素を指すポインタとは別に配列を指すポインタというものもある。
こんなことが出来る。
int foo[10];
int (*bar)[10] = &foo;
このときの bar の型は int(*)[10] ということになるわけだが……。
型情報として長さが含まれるのはかえって邪魔だ。
大抵の配列を受け取る関数 (str系やmem系など) は配列の大きさが固定ではないから。
配列の先頭要素で配列を代表させる (それが簡単な記法にする) ほうが都合がよかったんじゃないかと思う。
配列全体をひとつの値として扱いたい場合のほうが少ないだろうという判断もそれなりに合理的じゃないかな。
いまどきの言語 (Go とか Rust とか) は範囲を表すスライスという概念を導入して解決してるけど、
C の登場時期だと 2 ワードのオブジェクトを基本型にするのってなんかヤじゃない? と思ったとしても仕方ない。
198デフォルトの名無しさん (スプッッ Sd3f-2MD7)
2024/09/16(月) 17:22:11.94ID:udznqyd1d >>190
横からすまんが、記憶域期間って言葉も変
横からすまんが、記憶域期間って言葉も変
199デフォルトの名無しさん (スプッッ Sd3f-2MD7)
2024/09/16(月) 17:23:46.99ID:udznqyd1d200デフォルトの名無しさん (ワッチョイ bf79-MnYn)
2024/09/16(月) 17:29:54.17ID:E0fXFEgV0 この糞コテは半端知識のかまちょだからNGやスルー推奨
201はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f732-6w0d)
2024/09/16(月) 18:10:03.54ID:JwEVxA0h0 >>199
こっちは根拠になる規格の文面を提示してるんだから違うというなら違うと思う根拠を提示して。
こっちは根拠になる規格の文面を提示してるんだから違うというなら違うと思う根拠を提示して。
202デフォルトの名無しさん (アウアウウー Sa5b-E6+g)
2024/09/16(月) 18:57:26.00ID:ISRAyNkZa >>188
そらargv[][]では誤りだもんな
そらargv[][]では誤りだもんな
203デフォルトの名無しさん (アウアウエー Sadf-N1Zj)
2024/09/16(月) 21:32:46.16ID:NNTpe0yPa >>187
たしかに関数の引数だと違うんだな
https://ideone.com/MR7Vqm
#include <stdio.h>
char *hoge(char fuga[10])
{
++fuga;
return fuga;
}
int main(void) {
char hage[10] = {0};
char *p = hoge(hage);
printf("%p, %p\n", hage, p);
return 0;
}
// もちろん ++hage は出来ない
https://ideone.com/xEP42d
たしかに関数の引数だと違うんだな
https://ideone.com/MR7Vqm
#include <stdio.h>
char *hoge(char fuga[10])
{
++fuga;
return fuga;
}
int main(void) {
char hage[10] = {0};
char *p = hoge(hage);
printf("%p, %p\n", hage, p);
return 0;
}
// もちろん ++hage は出来ない
https://ideone.com/xEP42d
204デフォルトの名無しさん (ワッチョイ bf4f-NiVF)
2024/09/16(月) 22:10:35.73ID:hHcIxSUD0 >>197
流石に言ってる事が的外れ過ぎるのでもうちょっと勉強した方がいいと思うよ
流石に言ってる事が的外れ過ぎるのでもうちょっと勉強した方がいいと思うよ
恥ずかしながら、静的記憶域期間(で合ってるのか?)という言葉を知らなくて、ライフタイムは「静的」に含意されているのかと思ったワ…
しかし、記憶域期間って違和感あるなぁ
しかし、記憶域期間って違和感あるなぁ
わけわからん
>>205は撤回します
>>205は撤回します
207はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f732-vU+L)
2024/09/16(月) 22:43:01.97ID:JwEVxA0h0 >>203
余談だけど配列だけじゃなくて関数型も関数ポインタ型に調整されるよ。
余談だけど配列だけじゃなくて関数型も関数ポインタ型に調整されるよ。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【インバウンド】中国からの“渡航自粛”…ツアー1000人分の直前キャンセル「キャンセル料は免除してくれ」 ことしいっぱいキャンセルに [1ゲットロボ★]
- 【芸能】日中関係悪化でエンタメ業界に大ダメージ… JO1の中国でのイベント中止、邦画は公開延期、STARTOアイドルへの影響も [冬月記者★]
- 「国民の憤りを引き起こした」中国側“高市首相発言の撤回改めて要求” [どどん★]
- XやChatGPTで広範囲の通信障害 投稿や閲覧できず [蚤の市★]
- 【サッカー】日本代表、ボリビアに3発快勝 森保監督通算100試合目を飾る…鎌田、町野、中村がゴール [久太郎★]
- 【ローソン】ロゴの「L」で誤解生んだコーヒーカップ、デザイン変更へ 在庫使い切る3か月後にリニューアル [ぐれ★]
- パラドゲーやってる人に聞きたい総理の発言がそのまま国家意思になるって中世かよ [279479878]
- 【高市早苗】バス会社、中国からのキャンセルで12月で2000万円~3000万円の損失へ [115996789]
- 米シンクタンク「アメリカは台湾問題で"あいまい戦略"を取っている。高市早苗はこの方針から逸脱している」 [603416639]
- かしこいワンコっていうVtuberの子知ってる?
- 岡田克也「軽々しく存立危機事態とか言うべきじゃない」高市早苗「台湾で武力攻撃が発生したらどう考えても日本の存立危機事態」 [931948549]
- 俺が「う~寒い寒い」って言いながらお前らが寝てるお布団に潜り込んだら…
