[過去ログ]
C言語なら俺に聞け 163 (1002レス)
C言語なら俺に聞け 163 http://mevius.5ch.net/test/read.cgi/tech/1721137434/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
176: デフォルトの名無しさん (ワッチョイ ffe1-1pYN) [sage] 2024/09/15(日) 01:38:12.52 ID:STy65/7c0 >>174 > 文字列リテラルを指せるわけじゃない。 はい、これが間違いの全て 文字列リテラルはコンパイラーだけが理解できる「構文」に過ぎない それを実行時にさせないとはこれいかに?w 文字列リテラルは「実行時」には何て名前になってんだ? 配列でもないぞ 配列に代入される前のrvalueの事だ まぁ文字列は例外的にlvalueにもなれるが、rvalueであることには違いない http://mevius.5ch.net/test/read.cgi/tech/1721137434/176
177: デフォルトの名無しさん (ワッチョイ 9f56-3vlU) [sage] 2024/09/15(日) 01:45:15.62 ID:hg9QOZOF0 >>171 なんかいろいろ書いたけど最終的には自分もそれで合っていると思う 実用上は正直どこで役に立つのかあまり思いつかないが、規格上どういう建て付けになってるのかはとりあえず理解できたかも というか、実用上あんまり役に立つわけじゃないから今まで調べもしなかったというか 規格上は「リテラル」は存在せず integer/enumeration/floating/character は定数なんですね それで定数は記憶域期間を持たない 文字列リテラルは静的記憶域期
間を持つ 複合リテラルは関数本体の外か中かに応じて静的/自動記憶域期間を持つ、と うーんでもなあ 某言語でいきなり &1 とか書けるの知ってたら別に定数にも記憶域期間持たせればいいじゃんとか思っちゃうなあ とりあえずそうなっているというだけか http://mevius.5ch.net/test/read.cgi/tech/1721137434/177
178: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f732-vU+L) [sage] 2024/09/15(日) 01:46:17.50 ID:B6k8li/O0 >>175 > 静的記憶期間というのはスコープの事 ちがう。 記憶域期間はオブジェクトの寿命の区分。 6.2.4 を参照のこと。 寿命の区分が設定されている以上はオブジェクト (メモリ上のどこかにある) のこと。 > 文字列リテラルで生成されたデータは実行時には確実にアクセス可能で、消えてるなんて全くあり得ない 関数 (C のプログラムは関数の集合なので実質的にプログラムの全て) はオブジェクトではない。 私が「消える」と表現し
たのはこの意識があったからだが、機械語のレベルでどこかには存在するという意味ではそりゃ存在するだろう。 (同じ内容が連続する配列だったらループで書き込むような形にすることもあるかもしれない。) 配列の初期化子としての文字列リテラルは本来あるべき場所 (オブジェクト) から最適化で消えてるし、ポインタで指すことは出来ない。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/178
179: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f732-vU+L) [sage] 2024/09/15(日) 01:53:34.48 ID:B6k8li/O0 >>177 C++ の右辺値参照も左辺値参照も左辺値なんだよね。 参照を経由したら左辺値になるなら最初からそう出来ないか? と思ったことはある。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/179
180: デフォルトの名無しさん (ワッチョイ ffe1-1pYN) [sage] 2024/09/15(日) 01:58:39.53 ID:STy65/7c0 >>178 > ちがう。 記憶域期間はオブジェクトの寿命の区分。 だからエクステントと書いてんだろ! もしかして理解出来なかったか? > 配列の初期化子としての文字列リテラルは本来あるべき場所 (オブジェクト) から最適化で消えてるし 本来あるべき場所(オブジェクト)って何だよ?! 目茶苦茶だなw これがコンパイラーと実行時に存在すべき値(rvalue)をごっちゃにした成れの果てだなw http://mevius.5ch.net/test/read.cgi/tech/1721137
434/180
181: デフォルトの名無しさん (ワッチョイ ffe1-1pYN) [sage] 2024/09/15(日) 02:33:43.11 ID:STy65/7c0 初期化に使われた(文字列)リテラルが実行時にrvalueになったものに名前を付けるべきだな これは最適化でも消えることはない(当たり前だが…) 名前がないとまたリテラルは消えるから参照出来ない野郎が発生しかねないw http://mevius.5ch.net/test/read.cgi/tech/1721137434/181
182: デフォルトの名無しさん (スッップ Sdbf-2MD7) [] 2024/09/15(日) 12:24:08.15 ID:WkBCL5VYd >>174 >char* foo = "hoge"; > >のようなケースではポインタ foo は文字列リテラルを指してる その表現が間違ってる。 fooは静的記憶域を指してるが正しい。 intptr_t *bar = 0xAABB; この場合数値リテラルを指すなんて言わんだろ。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/182
183: 警備員[Lv.2][新芽] (ワッチョイ 5707-/vo+) [sage] 2024/09/15(日) 13:50:20.31 ID:krajCak80 >>char* foo = "hoge"; >> >>のようなケースではポインタ foo は文字列リテラルを指してる > >その表現が間違ってる。 >fooは静的記憶域を指してるが正しい。 彼も文字列リテラルは静的記憶域に置かれると言ってなかったっけ 僕にはこの2つの違いが分からないや 勘違いだったらごめんなさい http://mevius.5ch.net/test/read.cgi/tech/1721137434/183
184: デフォルトの名無しさん (ブーイモ MM8f-GITO) [sage] 2024/09/15(日) 16:04:15.59 ID:7leD3hDGM もっと中身のある話しようぜ http://mevius.5ch.net/test/read.cgi/tech/1721137434/184
185: デフォルトの名無しさん (ワッチョイ 9794-z7on) [sage] 2024/09/15(日) 17:53:23.56 ID:V70NGKYC0 >>68 規格に後置++演算子は実数型とポインタ型にしか使えないとあったけどそれの関係じゃないの? 規格でそう決まってるだけの話では? http://mevius.5ch.net/test/read.cgi/tech/1721137434/185
186: デフォルトの名無しさん (スプッッ Sd3f-2MD7) [] 2024/09/15(日) 18:13:20.02 ID:/tCGodXOd それだな http://mevius.5ch.net/test/read.cgi/tech/1721137434/186
187: デフォルトの名無しさん (ワッチョイ d7cd-qbvN) [sage] 2024/09/15(日) 21:42:32.09 ID:/wZr5+b/0 ちなみに int main(int argc, char *argv[]) と定義しても argvは++できる http://mevius.5ch.net/test/read.cgi/tech/1721137434/187
188: デフォルトの名無しさん (ワッチョイ ff63-y7MN) [sage] 2024/09/15(日) 23:27:23.69 ID:dUpBu3ui0 main の引数だけど、人によって好みがある *argv[]だったり、 **argvだったり、 さすがにargv[][]はいないと思う http://mevius.5ch.net/test/read.cgi/tech/1721137434/188
189: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f732-vU+L) [sage] 2024/09/16(月) 08:22:23.81 ID:JwEVxA0h0 >>185 配列はポインタに型変換される。 だから型は合うんだよ。 変更可能な左辺値でなければならないという制約に違反してる。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/189
190: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f732-vU+L) [sage] 2024/09/16(月) 08:28:07.90 ID:JwEVxA0h0 >>182-183 静的記憶域期間ってのは静的+記憶域期間なんだよ。 静的記憶域+期間じゃないんだよ。 まあ静的記憶域期間を持つオブジェクトが配置されている場所を静的記憶域と呼んでもカジュアルな場面ではそんなに不自然ではないとは思うけど。 実装上は専用のセクションに配置するのが普通だし。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/190
191: デフォルトの名無しさん (ワッチョイ 776e-SKTh) [sage] 2024/09/16(月) 08:30:39.50 ID:+a4Swf1f0 ここまでのまとめ Cは生産性が低い C使いも生産性が低い http://mevius.5ch.net/test/read.cgi/tech/1721137434/191
192: デフォルトの名無しさん (ワッチョイ ff63-y7MN) [sage] 2024/09/16(月) 10:51:57.39 ID:yKwOC4kA0 ID:+a4Swf1f0 は、言語に何使おうと生産性が低そう http://mevius.5ch.net/test/read.cgi/tech/1721137434/192
193: デフォルトの名無しさん (ワッチョイ ff2a-48Tr) [] 2024/09/16(月) 11:29:42.22 ID:0nzerU0W0 >>191,192 生産性など、君ら社畜を計る尺度に過ぎんよ。 芸術家は、時間をかけて1行の美しさを追及するものだ。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/193
194: デフォルトの名無しさん (ワッチョイ 1751-z7on) [sage] 2024/09/16(月) 12:43:08.20 ID:T6H9+ne50 >>189 変更可能な左辺値に配列型は含まれないからそれとは違うん?いつポインタに型変換されてんの? http://mevius.5ch.net/test/read.cgi/tech/1721137434/194
195: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f732-vU+L) [sage] 2024/09/16(月) 13:26:14.08 ID:JwEVxA0h0 >>194 6.3.2.1 より > 左辺値がsizeof演算子のオペランド,単項&演算子のオペランド,又は文字配列を初期化するのに使われる文字列リテラルである場合を除いて, > 型“〜型の配列”をもつ式は,型“〜型へのポインタ”の式に型変換する。 式として出てくる配列は一部の例外を除けば問答無用で変換されるので ++ のオペランドに配列が出てくるときも変換後のポインタ (rvalue) に対する演算 (実際には出来ないけど) と
して解釈されるということでいいと思う。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/195
196: デフォルトの名無しさん (ワッチョイ 1751-z7on) [sage] 2024/09/16(月) 14:56:21.22 ID:T6H9+ne50 >>195 配列オブジェクトの先頭の要素で左辺値じゃないって書いてあるな ということは左辺値の式の中に出てくる配列は左辺値じゃなくなっちゃうということ? なんでそんな仕様になったんだろうね http://mevius.5ch.net/test/read.cgi/tech/1721137434/196
197: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f732-vU+L) [sage] 2024/09/16(月) 16:28:24.01 ID:JwEVxA0h0 >>196 C には配列の要素を指すポインタとは別に配列を指すポインタというものもある。 こんなことが出来る。 int foo[10]; int (*bar)[10] = &foo; このときの bar の型は int(*)[10] ということになるわけだが……。 型情報として長さが含まれるのはかえって邪魔だ。 大抵の配列を受け取る関数 (str系やmem系など) は配列の大きさが固定ではないから。 配列の先頭要素で配列を代表させる (それが簡単な記法にする) ほうが都合がよかった
んじゃないかと思う。 配列全体をひとつの値として扱いたい場合のほうが少ないだろうという判断もそれなりに合理的じゃないかな。 いまどきの言語 (Go とか Rust とか) は範囲を表すスライスという概念を導入して解決してるけど、 C の登場時期だと 2 ワードのオブジェクトを基本型にするのってなんかヤじゃない? と思ったとしても仕方ない。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/197
198: デフォルトの名無しさん (スプッッ Sd3f-2MD7) [] 2024/09/16(月) 17:22:11.94 ID:udznqyd1d >>190 横からすまんが、記憶域期間って言葉も変 http://mevius.5ch.net/test/read.cgi/tech/1721137434/198
199: デフォルトの名無しさん (スプッッ Sd3f-2MD7) [] 2024/09/16(月) 17:23:46.99 ID:udznqyd1d >>189 >配列はポインタに型変換される。 それは関数呼び出しの場合だぞ http://mevius.5ch.net/test/read.cgi/tech/1721137434/199
200: デフォルトの名無しさん (ワッチョイ bf79-MnYn) [sage] 2024/09/16(月) 17:29:54.17 ID:E0fXFEgV0 この糞コテは半端知識のかまちょだからNGやスルー推奨 http://mevius.5ch.net/test/read.cgi/tech/1721137434/200
201: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f732-6w0d) [sage] 2024/09/16(月) 18:10:03.54 ID:JwEVxA0h0 >>199 こっちは根拠になる規格の文面を提示してるんだから違うというなら違うと思う根拠を提示して。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/201
202: デフォルトの名無しさん (アウアウウー Sa5b-E6+g) [sage] 2024/09/16(月) 18:57:26.00 ID:ISRAyNkZa >>188 そらargv[][]では誤りだもんな http://mevius.5ch.net/test/read.cgi/tech/1721137434/202
203: デフォルトの名無しさん (アウアウエー Sadf-N1Zj) [] 2024/09/16(月) 21:32:46.16 ID: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 http://mevius.5ch.net/test/read.cgi/tech/1721137434/203
204: デフォルトの名無しさん (ワッチョイ bf4f-NiVF) [] 2024/09/16(月) 22:10:35.73 ID:hHcIxSUD0 >>197 流石に言ってる事が的外れ過ぎるのでもうちょっと勉強した方がいいと思うよ http://mevius.5ch.net/test/read.cgi/tech/1721137434/204
205: 警備員[Lv.1][新芽] (ワッチョイ f731-/vo+) [sage] 2024/09/16(月) 22:25:26.45 ID:z+htC2pc0 恥ずかしながら、静的記憶域期間(で合ってるのか?)という言葉を知らなくて、ライフタイムは「静的」に含意されているのかと思ったワ… しかし、記憶域期間って違和感あるなぁ http://mevius.5ch.net/test/read.cgi/tech/1721137434/205
206: 警備員[Lv.1][新芽] (ワッチョイ f731-/vo+) [sage] 2024/09/16(月) 22:30:23.39 ID:z+htC2pc0 わけわからん >>205は撤回します http://mevius.5ch.net/test/read.cgi/tech/1721137434/206
207: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f732-vU+L) [sage] 2024/09/16(月) 22:43:01.97 ID:JwEVxA0h0 >>203 余談だけど配列だけじゃなくて関数型も関数ポインタ型に調整されるよ。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/207
208: デフォルトの名無しさん (ワッチョイ 9f7c-2MD7) [] 2024/09/16(月) 22:52:59.17 ID:TDYyKtgo0 >>201 規格に配列は常にポインタに変換されるなんて書いて無いぞ。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/208
209: デフォルトの名無しさん [sage] 2024/09/16(月) 23:00:53.05 ID:f3T7KT8T0 >>208 「常に」とは書かれていない 「ポインタに変換される」ではなく「ポインタに型変換される」 >>102がまさにそれでしょ E1という配列が関数呼び出しでない場合においてもポインタという型に変換されているから出来ること http://mevius.5ch.net/test/read.cgi/tech/1721137434/209
210: デフォルトの名無しさん (ワッチョイ ff63-y7MN) [sage] 2024/09/16(月) 23:10:52.64 ID:yKwOC4kA0 >char *hoge(char fuga[10]) こう書いてあっても、関数内で10を使う訳ではない 関数内で仮に100個めの要素アクセスするロジック書いてもエラーにはならない (実行時にはエラーになると思う、多分) だから、 >char *hoge(char fuga[]) 添え字無しにしても良いことになる http://mevius.5ch.net/test/read.cgi/tech/1721137434/210
211: デフォルトの名無しさん (ワッチョイ d7cd-qbvN) [sage] 2024/09/17(火) 01:04:31.11 ID:BokinMog0 >>210 元々ローカルでchar hage[10];と定義して10以上をアクセスしてもコンパイル時にはエラーにならないでしょ 引数に[10]と書くとしたら可読性のため(この関数では[0~9]までアクセスする可能性があると明示するため) http://mevius.5ch.net/test/read.cgi/tech/1721137434/211
212: デフォルトの名無しさん (スプッッ Sd3f-2MD7) [] 2024/09/17(火) 10:15:58.36 ID:9gub94Dsd __FILE__ とか __LINE__ は大文字なのになんで __func__ は小文字なん? http://mevius.5ch.net/test/read.cgi/tech/1721137434/212
213: デフォルトの名無しさん (アウアウエー Sadf-N1Zj) [] 2024/09/17(火) 10:17:16.72 ID:TMGdiCOOa 範囲の問題じゃなくて ++hage または hage++ が出来るか出来ないかが問題なんです http://mevius.5ch.net/test/read.cgi/tech/1721137434/213
214: デフォルトの名無しさん (ワッチョイ ff63-y7MN) [sage] 2024/09/17(火) 11:06:41.56 ID:bX/ekV+z0 一見配列を受け渡ししているように見えるけれど、 実際はポインターとして受け渡ししているってことでしょ http://mevius.5ch.net/test/read.cgi/tech/1721137434/214
215: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ d70f-6w0d) [sage] 2024/09/17(火) 11:56:03.91 ID:FRc2ySeD0 >>212 __func__ はマクロではないからだと思う。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/215
216: デフォルトの名無しさん (ワッチョイ ff63-y7MN) [sage] 2024/09/17(火) 12:47:41.54 ID:bX/ekV+z0 #include <stdio.h> char hage[10] = {0}; char *hoge(void) { // ++hage; // error '++' には左辺値が必要です。 // return hage; return &hage[1]; } int main(void) { char *p = hoge(); printf("%p, %p\n", hage, p); return 0; } http://mevius.5ch.net/test/read.cgi/tech/1721137434/216
217: デフォルトの名無しさん (アウアウエー Sadf-N1Zj) [] 2024/09/17(火) 13:07:46.14 ID:TMGdiCOOa >>214 そんなことは判ってるよ (char hage[10]) で hage++ または ++hage 出来ちゃってる(ように観える)のが問題なんでしょ 関数の引数は (char hage[]) または (char *hage) のみにすれば良かった (char hage[10]) はどうみても蛇足(結局境界テストされてないし) http://mevius.5ch.net/test/read.cgi/tech/1721137434/217
218: デフォルトの名無しさん (ワッチョイ ff63-y7MN) [sage] 2024/09/17(火) 13:11:47.81 ID:bX/ekV+z0 問題だと思う人は、使わないようにしましょう 開発サイトでそういうルールを用意するのも手です http://mevius.5ch.net/test/read.cgi/tech/1721137434/218
219: デフォルトの名無しさん (スプッッ Sd3f-2MD7) [] 2024/09/17(火) 17:17:11.73 ID:9gub94Dsd >>215 納得しました。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/219
220: デフォルトの名無しさん (ワッチョイ 9ffd-NiVF) [] 2024/09/17(火) 20:17:27.08 ID:dLWvmxgr0 >>197 そもそもstr系mem系はアドレスを受け取るんであって配列を受け取る関数ではないっていう勘違いがあるんだけど それはともかく大きさがどうのとかなんちゃらが都合がいいとか、本当にC言語でなんかプログラムを書いた事あるの? http://mevius.5ch.net/test/read.cgi/tech/1721137434/220
221: デフォルトの名無しさん (スプッッ Sd3f-2MD7) [] 2024/09/17(火) 20:58:19.23 ID:9gub94Dsd 俺は尻より胸派なんだよね。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/221
222: デフォルトの名無しさん (ワッチョイ d7cd-qbvN) [sage] 2024/09/18(水) 00:42:28.78 ID:wcwImUMc0 >>217 この場合に限らずcでは範囲チェックなどされないでしょ 必要なら自分でチェックするのが原則 void aaa(char hage[10],int idx) { if((UINT)idx < sizeof(hage)/sizeof(hage[0])) printf("%d=%d¥n",idx,hage[idx]); else printf("%dは範囲外だhage¥n",idx); } これなら[10]に意味が出る http://mevius.5ch.net/test/read.cgi/tech/1721137434/222
223: デフォルトの名無しさん (ワッチョイ bfee-GITO) [sage] 2024/09/18(水) 01:22:58.84 ID:9DvoA/Ly0 ド素人w http://mevius.5ch.net/test/read.cgi/tech/1721137434/223
224: デフォルトの名無しさん (ワッチョイ d712-IGT5) [sage] 2024/09/18(水) 05:59:54.60 ID:Y3+kk9yU0 >>222 c faq 6.21 (英文が詳しい) https://c-faq.com/aryptr/aryparmsize.html >>207 の'調整'は'adjust'だろう N1256を'adjust'で検索するのじゃ Look, a new day has begun. http://mevius.5ch.net/test/read.cgi/tech/1721137434/224
225: デフォルトの名無しさん (ワッチョイ d710-SKTh) [sage] 2024/09/18(水) 07:51:55.61 ID:9Z5pFVfx0 8/16bit時代の1バイトでも、1ステップでも減らせってのを経験した人と 最近の可読性、移植性、安全性優先設計が当たり前世代とのギャップ。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/225
226: デフォルトの名無しさん (ワッチョイ bf32-GITO) [sage] 2024/09/18(水) 08:59:57.51 ID:9DvoA/Ly0 ギャップの問題じゃねーから 文脈すら理解できないじじいはすっこんでろ http://mevius.5ch.net/test/read.cgi/tech/1721137434/226
227: デフォルトの名無しさん (ワッチョイ 5701-vU+L) [sage] 2024/09/18(水) 09:30:25.30 ID:Qk7JHPx80 専門板によくいるアスペだな http://mevius.5ch.net/test/read.cgi/tech/1721137434/227
228: デフォルトの名無しさん (ワッチョイ ff63-y7MN) [sage] 2024/09/18(水) 10:34:45.37 ID:UYQxUcxO0 225 は釣りでしょう http://mevius.5ch.net/test/read.cgi/tech/1721137434/228
229: 警備員[Lv.2][新芽] (ワッチョイ bfd9-/vo+) [sage] 2024/09/18(水) 13:08:51.24 ID:eTGNACyx0 >>222 sizeof(hage) で配列のサイズが求まるの? と思ったら、「char * (ポインタ)の大きさを返すよ」みたいな警告が @gcc http://mevius.5ch.net/test/read.cgi/tech/1721137434/229
230: デフォルトの名無しさん (ワッチョイ ff63-y7MN) [sage] 2024/09/18(水) 13:15:29.42 ID:UYQxUcxO0 釣りだか天然だか、分からなくなってきた 笑 http://mevius.5ch.net/test/read.cgi/tech/1721137434/230
231: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f732-vU+L) [sage] 2024/09/18(水) 13:35:28.77 ID:td/rS/wM0 今どきの統合開発環境を使ってるなら変数の型くらい見れると思うけれど 古典的な手法としてあえてエラーにしてメッセージを読むという型の確認方法がある。 void foo(char bar[10]) {} int main(void) { int baz = foo; } こんなコードをたとえば gcc でコンパイルを試みると error: initialization of 'int' from 'void (*)(char *)' makes integer from pointer without a cast というエラーになる。 foo の型が void (*)(char *) であるこ
とがわかる。 foo は関数型の式 (関数指示子) なので暗黙に関数ポインタに型変換されているのと bar に相当する箇所の型が char* になってるのがわかる。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/231
232: 警備員[Lv.3][新芽] (ワッチョイ bfa6-/vo+) [sage] 2024/09/18(水) 13:51:08.91 ID:eTGNACyx0 なるほど 勉強になります http://mevius.5ch.net/test/read.cgi/tech/1721137434/232
233: デフォルトの名無しさん (スプッッ Sd3f-2MD7) [] 2024/09/18(水) 14:54:11.13 ID:LEoKOQZWd >>222 >この場合に限らずcでは範囲チェックなどされないでしょ >必要なら自分でチェックするのが原則 > >void aaa(char hage[10],int idx) >{ > if((UINT)idx < sizeof(hage)/sizeof(hage[0])) > printf("%d=%d¥n",idx,hage[idx]); > else > printf("%dは範囲外だhage¥n",idx); >} > >これなら[10]に意味が出る printf("%uz\n", sizeof(hage)/sizeof(hage[0])); の結果ってどんな値
表示されるの? http://mevius.5ch.net/test/read.cgi/tech/1721137434/233
234: デフォルトの名無しさん (スプッッ Sd3f-2MD7) [] 2024/09/18(水) 14:56:10.00 ID:LEoKOQZWd 書式のとのuzじゃなくてzuだっけ?zだけでよかったっけ? ま、主旨はそこじゃないからいっか。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/234
235: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ d7e2-6w0d) [sage] 2024/09/18(水) 15:47:33.09 ID:3rwci13t0 >>233 sizeof(char*)/sizeof(char) ということになる。 sizeof(char) は確実に 1 だから結果としては単に char* のバイト数ってことだね。 この場合は「『もし 10 に意味があるとしても』境界チェックはされないことに変わりないのでなんの役にも立ってない。 役に立てるとしたらここまで書かなきゃならない」というのが主旨なのであくまでもしもの話。 実際の値はどうでもよい文脈だと思う。 http://mevius.5ch.net/test/read.cgi/tech/
1721137434/235
236: デフォルトの名無しさん (ワッチョイ d7cd-qbvN) [sage] 2024/09/18(水) 16:33:08.44 ID:wcwImUMc0 >>224 ああそうなの 昔のことだから記憶違いをしてたようだ http://mevius.5ch.net/test/read.cgi/tech/1721137434/236
237: デフォルトの名無しさん (スプッッ Sd3f-2MD7) [] 2024/09/18(水) 16:43:30.74 ID:LEoKOQZWd >>235 >>222 の「これなら[10]に意味が出る」ってのは間違いってことね。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/237
238: デフォルトの名無しさん (ワッチョイ d7cd-qbvN) [sage] 2024/09/18(水) 18:00:34.97 ID:wcwImUMc0 'ここの10は意味ありませんよ' って警告を出してもいいじゃんってことでしょ それなら例えば typedef char HAGE_TBL[10]; void foo(HAGE_TBL hage) {} (毎回10とか書くのは危険なのでこういう使い方が多いと思う) などとした場合に毎回警告が出てうざいことになるんじゃないか http://mevius.5ch.net/test/read.cgi/tech/1721137434/238
239: デフォルトの名無しさん (ワッチョイ ff63-y7MN) [sage] 2024/09/18(水) 18:07:31.49 ID:UYQxUcxO0 警告ならまだ笑っていられるが、 明らかに書いた奴の意図とは違って誤動作してるだろ http://mevius.5ch.net/test/read.cgi/tech/1721137434/239
240: デフォルトの名無しさん (スプッッ Sd3f-2MD7) [] 2024/09/18(水) 18:30:29.69 ID:LEoKOQZWd >>222 のバグを晒すスレはここですか? http://mevius.5ch.net/test/read.cgi/tech/1721137434/240
241: デフォルトの名無しさん (スプッッ Sd3f-2MD7) [] 2024/09/18(水) 18:46:04.44 ID:LEoKOQZWd C言語は難しいな http://mevius.5ch.net/test/read.cgi/tech/1721137434/241
242: デフォルトの名無しさん (ワッチョイ ff63-y7MN) [sage] 2024/09/18(水) 20:53:02.12 ID:UYQxUcxO0 void aaa()の中で、 引数で渡された値が何かを確かめて見ると良い それと、 sizeof(hage)やsizeof(hage[0])の値も プログラム書いた人の意図としては、 sizeof(hage)/sizeof(hage[0])が10になるはずなんだが さてさていくつだろうか? http://mevius.5ch.net/test/read.cgi/tech/1721137434/242
243: デフォルトの名無しさん (ワッチョイ 9f7c-2MD7) [] 2024/09/19(木) 00:15:21.84 ID:5H+5PGV10 もうやめて!>>222 のライフはゼロよ! http://mevius.5ch.net/test/read.cgi/tech/1721137434/243
244: デフォルトの名無しさん (ワッチョイ 9f1e-S785) [sage] 2024/09/19(木) 06:32:15.59 ID:zdFAvN1E0 本人が新たなネタを出してくるんだもん。 >>238 でもわざわざ typedef char HAGE_TBL[10]; ってやっておきながら、なんで void foo(HAGE_TBL hage) なの? 構造体と同じように void foo(HAGE_TBL *hage) ってしてみたら新たな何かが見えてこないかい? http://mevius.5ch.net/test/read.cgi/tech/1721137434/244
245: デフォルトの名無しさん (ブーイモ MMbf-GITO) [sage] 2024/09/19(木) 15:36:15.62 ID:bQAYIDF0M cは洗練された型システム持ってないんだからそんなところ頑張っても無駄なんだよ この悟りに至って始めて脱初級 原則語るならそれからにしてくれ http://mevius.5ch.net/test/read.cgi/tech/1721137434/245
246: デフォルトの名無しさん (ワッチョイ ff63-y7MN) [sage] 2024/09/19(木) 15:40:30.12 ID:cPR7xA8Z0 Cは一部の洗練された型システム持つ言語よりも遙かに自由度が高い そこが分かってようやく中級レベル あとは本人の努力次第で空も飛べるし海も潜れる http://mevius.5ch.net/test/read.cgi/tech/1721137434/246
247: デフォルトの名無しさん (ワッチョイ bfda-GITO) [sage] 2024/09/19(木) 15:50:31.78 ID:c2v//UgT0 おいおい そのぶん危険なんだから持ち上げる部分でもないだろ お前も初級 http://mevius.5ch.net/test/read.cgi/tech/1721137434/247
248: デフォルトの名無しさん (ワッチョイ ff63-y7MN) [sage] 2024/09/19(木) 17:19:57.71 ID:cPR7xA8Z0 ナイフは危険だが有用 不器用者は使わない方が良い http://mevius.5ch.net/test/read.cgi/tech/1721137434/248
249: デフォルトの名無しさん (ワッチョイ b766-qbvN) [sage] 2024/09/19(木) 17:44:18.26 ID:8NYyNXbk0 >>244 typedefは新たな型を作るわけじゃない別名を定義するだけから void foo(char hage[10]) と void foo(HAGE_TBL hage) は同じことだよ http://mevius.5ch.net/test/read.cgi/tech/1721137434/249
250: デフォルトの名無しさん (ワッチョイ bf29-GITO) [sage] 2024/09/19(木) 20:28:27.65 ID:c2v//UgT0 >>248 c言語ってとっくの昔から自由にキャストしまくれる言語じゃないの知ってるか? さぁお前はなんと答える? http://mevius.5ch.net/test/read.cgi/tech/1721137434/250
251: デフォルトの名無しさん (ワッチョイ ff63-y7MN) [sage] 2024/09/19(木) 20:47:13.84 ID:cPR7xA8Z0 そんなに怖がるなよ 食われるわけじゃないんだから http://mevius.5ch.net/test/read.cgi/tech/1721137434/251
252: デフォルトの名無しさん (アウアウエー Sadf-3vlU) [] 2024/09/19(木) 21:11:19.13 ID:/CBFTgYsa >>245 悟った人は全部void* http://mevius.5ch.net/test/read.cgi/tech/1721137434/252
253: デフォルトの名無しさん (ワッチョイ ff4c-KlCL) [] 2024/09/19(木) 21:52:43.48 ID:j90utfqH0 文字も数字も全部intでいいやん http://mevius.5ch.net/test/read.cgi/tech/1721137434/253
254: デフォルトの名無しさん (アウアウエー Sadf-3vlU) [] 2024/09/19(木) 21:56:05.41 ID:/CBFTgYsa getch() は int http://mevius.5ch.net/test/read.cgi/tech/1721137434/254
255: デフォルトの名無しさん (ワッチョイ 9f1e-S785) [sage] 2024/09/20(金) 07:15:20.20 ID:dn4N5ANS0 >>249 それが不満なようだから「HAGE_TBL * にしたら何ができるか考えてみては?」ということでは? http://mevius.5ch.net/test/read.cgi/tech/1721137434/255
256: デフォルトの名無しさん (ササクッテロ Sp47-i443) [sage] 2024/09/24(火) 10:26:30.49 ID:/2yiAcKTp 昔のコンピュータはメモリー少ないから、intで文字持つなんて贅沢だったんだよ http://mevius.5ch.net/test/read.cgi/tech/1721137434/256
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 746 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.446s