1 名前:デフォルトの名無しさん (ワッチョイ 0f63-sFbk) mailto:sage [2023/04/21(金) 14:05:20.18 ID:rqj2HSDF0.net] !extend:checked:vvvvv:1000:512 (新スレ立ての際上記コマンドを2行書き込んでください) C言語の話題のみ取り扱います C++の話題はC++スレへ 質問には最低限の情報(ソース/コンパイラ/OS)を付ける 数行で収まらないソースは以下を適当に使ってURLを晒す https://paiza.io/ https://ideone.com/ codepad.org/ C17 www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf C11 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 www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf kikakurui.com/x3/X3010-2003-01.html C FAQ 日本語訳 www.kouno.jp/home/c_faq/ JPCERT C コーディングスタンダード https://www.jpcert.or.jp/sc-rules/ ※前スレ C言語なら俺に聞け 160 https://mevius.5ch.net/test/read.cgi/tech/1672191630/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
301 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg) mailto:sage [2023/07/10(月) 01:20:39.58 ID:EhhseXmK0.net] >>299 malloc で確保した領域はどんなオブジェクト (少なくとも仕様の範囲内で作れる型に対応するオブジェクト) に対しても適切に境界調整されている。 そこらへんは別の話。
302 名前:デフォルトの名無しさん (スプープ Sd3f-4U7T) mailto:sage [2023/07/10(月) 08:43:48.54 ID:Xrxae+evd.net] 先頭と領域が確保されていればその間にアクセスできない部分があることはないだろう そんな器用なことをする必然性がないわ
303 名前:デフォルトの名無しさん (アウアウウー Sa9b-8N3f) mailto:sage [2023/07/10(月) 08:47:35.15 ID:7JEyTvQka.net] #include <stdio.h> void main(void) { int card[5][5]; int **p1; int *p2 p1 = card; p2 = card[0]; }
304 名前:デフォルトの名無しさん (ワッチョイ ff7c-DxV6) mailto:sage [2023/07/10(月) 09:02:15.74 ID:BD2ve/J+0.net] >>302 こっちでやれ https://mevius.5ch.net/test/read.cgi/tech/1427572389/
305 名前:デフォルトの名無しさん (アウアウウー Sa9b-8N3f) mailto:sage [2023/07/10(月) 09:24:10.89 ID:dS/bwvgRa.net] >>303 おまえそっちでやれ ○○のはずとかそんなんで書くぐらいなら普通に書け
306 名前:デフォルトの名無しさん (ワッチョイ ff7c-DxV6) mailto:sage [2023/07/10(月) 09:29:04.81 ID:BD2ve/J+0.net] >>304 何のことだよ?
307 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f73e-kkOg) mailto:sage [2023/07/10(月) 09:53:48.86 ID:EhhseXmK0.net] >>301 オブジェクトのレイアウトについての話じゃなくてポインタ演算に制約がある。 ポインタの演算の結果は配列の要素か配列の最後の要素を ひとつ過ぎた位置を指さなければならない。 その位置にアクセスする (単項演算子 * を適用する) かどうかに関係なく ポインタの演算の結果がその条件を満たさない場所を指すときは未定義となる。 (C99 なら 6.5.6 の加減演算子の項目に書いてある。) 今回の場合は *card が返すのは二次元配列の「最初の行」を指すポインタなので このポインタを元に演算した結果が最初の行の外を指してしまったらダメと解釈できる。 仕様に書かれている演算はその演算に相当するレイアウトで配置される という意味で解釈することも出来ると私は考えていたが 仕様の文面に厳密に言えば駄目かもわからん。 現代的な処理系ではポインタは由来 (provenance) という概念を持っていて 演算の元になったオブジェクトを外れたら未定義であるということを 利用して最適化することもある。 これは実際にある話で、必然性を言うならそれで速くなる可能性があるという理由がある。 仕様に厳密にしないとわけのわからないことが起こるのが C というものなので 仕様の解釈は大事だよ。
308 名前:デフォルトの名無しさん (ワッチョイ 9fad-kkOg) [2023/07/10(月) 10:31:52.15 ID:ifz8cUKw0.net] >>302 p1 = card; の所はコンパイルエラーが出て欲しいところだが、Cだと警告だけ出して先に進んじゃうかな。
309 名前:デフォルトの名無しさん (ワッチョイ ff7c-DxV6) mailto:sage [2023/07/10(月) 10:34:39.51 ID:BD2ve/J+0.net] int card[5][5]; となっているとき &card 二次元配列全体へのポインタ card 最初の行へのポインタ *card 最初の要素へのポインタ
310 名前:デフォルトの名無しさん (ワッチョイ bf79-CBkq) mailto:sage [2023/07/10(月) 12:23:15.05 ID:pvSg+WfU0.net] 2次元配列なんてExcelのRangeオブジェクトが返す配列ぐらいでしかお世話になったことないわ 特に効率的でもないし構造体でええやろ
311 名前:デフォルトの名無しさん (スップ Sd3f-hfg2) mailto:sage [2023/07/10(月) 12:47:58.91 ID:Wg7MEfSed.net] 何でそこで構造体?
312 名前:デフォルトの名無しさん (ワッチョイ 175f-kkOg) mailto:sage [2023/07/10(月) 12:53:57.17 ID:AzWw4sMa0.net] >>308 下2行は正しくない。
313 名前:デフォルトの名無しさん (スップ Sd3f-hfg2) mailto:sage [2023/07/10(月) 13:25:18.46 ID:Wg7MEfSed.net] §6.3.2.1の段落2で定める例外にあたらない場合という但し書きが足りないね 悪かったよ
314 名前:デフォルトの名無しさん (ワッチョイ ff63-/79E) [2023/07/10(月) 18:04:08.51 ID:SSHQru750.net] 5ch、専用ブラウザがサポート終了し、撤退する様です。 FireFoxだと書き込める様です。 それ以外のブラウザも多分大丈夫なんでしょうが、試してはいません。
315 名前:デフォルトの名無しさん (ワッチョイ ff7c-rqKn) [2023/07/10(月) 18:05:43.31 ID:BD2ve/J+0.net] ソースplz
316 名前:デフォルトの名無しさん (スップ Sd3f-9JJG) [2023/07/10(月) 18:24:57.71 ID:EIZKDTevd.net] 処理系が16byte境界に合うように 「card[0][4]とcard[1][0]の間にパディングを入れる」ってのが起こりうるか不安 わざわざコンパイラがそんなことする理由は 1. 16byte境界の合わせたほうがindexの計算が速い 2. card[0][5]へのアクセスを不正とみなして、ここへの書き込みを検知するフラグを入れる 規格上パディングが入らないことが保証されるならこの話は忘れてくれ
317 名前:デフォルトの名無しさん (ワッチョイ ff63-/79E) [2023/07/10(月) 18:29:02.59 ID:SSHQru750.net] Talk専用ブラウザ 「Jane Style」 ← 5chの記述が消えました 20230710 Version 5.00 公開 ・Talk に対応しました * 5ch.net のサポートを終了しました janesoft.net/janestyle/
318 名前:デフォルトの名無しさん (アウアウウー Sa9b-HEX/) [2023/07/10(月) 18:54:15.08 ID:ebofKpc7a.net] >int **p1; 無いわωωω
319 名前:デフォルトの名無しさん (ワッチョイ 9fad-OD6X) mailto:sage [2023/07/11(火) 02:24:43.39 ID:vn98dBP10.net] >>314 https://agree.5ch.net/test/read.cgi/operate/9240230711/ 正確にはJaneStyleが離反した > 00015ちゃんねる ★2023/07/11(火) 00:00:00.00ID:LokiTech > Janestyleはもう5ch.netと提携していません。 > Janestyle以外の専用ブラウザをご利用ください。 > 旧バージョンの5chブラウザ(API前)は近く再度利用可能となります。 > (以下略)
320 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 3732-/79E) mailto:sage [2023/07/11(火) 11:41:03.76 ID:MoKwTryZ0.net] >>315 おそらく連続 (contiguously) というのは間に余計なものが入ることはないという意味で書いてると思う。
321 名前:デフォルトの名無しさん (ワッチョイ b702-VAl4) mailto:sage [2023/07/11(火) 12:37:10.33 ID:UJem4sQV0.net] テスト > どういう理屈か知らんけど > chmateで『URLから開く』で見たい板のURL貼り付けして > 「5ch」の部分を「5Ch」に変えて開くと > 5chのスレchmateで見れて草 https://twitter.com/motokamin_/status/1678473238177783835 (deleted an unsolicited ad)
322 名前:デフォルトの名無しさん (ワッチョイ e2ad-/jfo) [2023/07/17(月) 05:23:15.01 ID:0PvTd+Ok0.net] chmate はもう対応できてないかな。俺は読み書きできるようになったよ。 今これはPCからで Siki っていうの使って書いてるが。
323 名前:デフォルトの名無しさん (ワッチョイ 163e-MI76) mailto:sage [2023/07/17(月) 09:16:25.38 ID:YifLUjyU0.net] 旧 API を復活させて制限が緩くなったから昔の専ブラがそのままかちょっとした設定変更で使えるよ。 今のところ PC 用の専ブラとしては JaneXeno か Siki が決定版だと思われているようだ。
324 名前:デフォルトの名無しさん (ワッチョイ 3279-EJzg) mailto:sage [2023/07/17(月) 11:31:18.04 ID:SG+RSRxx0.net] >>321 PCはAPI対応前の昔のlive2ch(live5ch)が使える
325 名前:デフォルトの名無しさん (ワッチョイ 4d46-am1z) [2023/07/17(月) 11:33:54.45 ID:o8kBjP6A0.net] ninja は make を完全に置き換え可能になったでござるかニンニン?
326 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 163e-MI76) mailto:sage [2023/07/17(月) 11:48:18.17 ID:YifLUjyU0.net] >>324 設計思想が異なる。 ninja は make ほど多機能ではなく、メタビルドツール (cmake など) と組み合わせるのを前提としている。 どうせメタビルドツールは使うという前提なら ninja のほうが使い勝手が良いと思うが、 そうでないなら make のほうが楽だと思う。
327 名前:デフォルトの名無しさん (ワッチョイ dfad-onGn) [2023/07/22(土) 17:50:40.48 ID:ZqN2VkQO0.net] Siki はおすすめ記事が出ていた。 5chブラウザー、JaneStyle代わりのオススメは「Siki」 https://news.yahoo.co.jp/articles/adfd44b291fbc07686ea4735e1397a3287aa4045
328 名前:デフォルトの名無しさん (ワッチョイ 7f63-cTWz) mailto:sage [2023/07/27(木) 01:32:04.41 ID:z625zk2O0.net] 現状専用ブラウザJaneStyle4.23を落としてきて修正パッチを当てて動かしてます。 修正パッチは有志が機械語レベルまで降りて解析し対処してます。 今まで無かった機能まで追加してます。その技術力はスゴイですね。 ただ、専用ブラウザは今後5ちゃんねるの仕様が変わったときに 開発者がメンテできるかどうかで生死が決まりそうですね。
329 名前:デフォルトの名無しさん (ワッチョイ 7310-X/lp) mailto:sage [2023/08/02(水) 10:02:23.97 ID:6slkiMgF0.net] なんか昔「コンパイル言語は消滅してスクリプト言語が主流になる!!」って主張聞いて オープンソースアプリはともかく商業アプリでスクリプト言語使ってたら 速攻解析されてコピーなりクラックされて(その結果どうなるかはわからんけど)商売にならないんじゃないのかと思ったけど 現状どうなのかな? JaneStyleの 不具合発生→ねらー修正 っての見てるとバイナリーコードでもスクリプトコードでも解析難易度は変わらないのかなとも思うけど。
330 名前:デフォルトの名無しさん (ワッチョイ 1746-ZTxv) [2023/08/02(水) 10:53:42.75 ID:19FN81hV0.net] >>328 事実如何を措いて、 主流以外の傍流は消滅するという理屈がそもそもおかしい。
331 名前:デフォルトの名無しさん (ラクッペペ MMe6-Fuds) mailto:sage [2023/08/02(水) 11:00:33.97 ID:Vv20iihFM.net] バイナリクラックなら開発言語そのものにはあまり意味はない気がするけどな バイナリエディタで稼働中の実行コード覗かれれば元の言語が何であろうが同じこと
332 名前:デフォルトの名無しさん (ワッチョイ be63-1j9t) mailto:sage [2023/08/02(水) 11:10:57.90 ID:STym7Vrv0.net] こういうのはやはりファームやってた人は強いのだろうか?笑
333 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b73e-yh3V) mailto:sage [2023/08/02(水) 11:11:56.50 ID:Vhf3uqZN0.net] 暗号化やら難読化やらを駆使しても 実行中には実行できる形になってるのは どうしようもないもんな。 だからライセンスで制約を付けるんだが、 不特定多数をユーザーとするビジネスモデルだと 制約を守らせるのも難しいのだと思う。
334 名前:デフォルトの名無しさん (ワッチョイ be63-1j9t) mailto:sage [2023/08/02(水) 11:38:35.24 ID:STym7Vrv0.net] 不具合を何度も指摘されても放置していて 痺れ切らしたユーザーが解析してパッチを公開した これが最初だったと思う
335 名前:デフォルトの名無しさん (ワッチョイ 4af0-0TAO) mailto:sage [2023/08/02(水) 11:45:48.58 ID:JKibevwe0.net] あれ難読化してあるの?
336 名前:デフォルトの名無しさん (ワッチョイ 6aad-kNqZ) mailto:sage [2023/08/02(水) 11:54:41.63 ID:na1pjdup0.net] 業務用アプリならサブスクとクラウドって感じだろうけど 個人向けのだとどうなんだろうね まあそういう海賊版はアップロードした奴を捕まえることで対処しているっぽいけど アプリの制限取っ払われるのはもうどうしようもないんじゃないかな
337 名前:デフォルトの名無しさん (ワッチョイ 6aad-kNqZ) mailto:sage [2023/08/02(水) 11:55:36.50 ID:na1pjdup0.net] 難読化はしてない いやらしいほどに丸見え
338 名前:デフォルトの名無しさん (スッププ Sdb6-FXAW) mailto:sage [2023/08/02(水) 20:21:52.90 ID:Zi22N3SKd.net] >>328 オープンソースを勘違いしてる?
339 名前:デフォルトの名無しさん (ワッチョイ be63-1j9t) mailto:sage [2023/08/02(水) 20:58:10.27 ID:STym7Vrv0.net] 質問型式ではなく、自分はこう考えていると書いて
340 名前:デフォルトの名無しさん (スッププ Sdb6-FXAW) mailto:sage [2023/08/02(水) 23:54:36.96 ID:W7+oBwzNd.net] >>328 次元の違う問題を比較してると思う スクリプトでコンパイル言語を代替できるようになったとしても 商業ソフトを供給するほうがスクリプトでないと実装できないことにはならないし サーバーサイドで重要な処理を行うようにすればスクリプトでもそこは解析できないわけだし(今回の5chのAPI仕様変更みたいに)
341 名前:デフォルトの名無しさん (ワッチョイ 6aad-Z/b2) [2023/08/03(木) 04:03:41.71 ID:/xW45k0z0.net] >>328 主流かどうかはわからんけどJavaのような仮想マシンで動くやつは流行ったな(Androidスマホで採用されたので思い切り流行った)。Perlとかのインタープリタの言語も内部でコンパイルしてから動くのでなんとなく似ている。 こういう風に仮想マシンで動くようにするとOSやCPUが違っても互換性を保つのが楽になる。
342 名前:デフォルトの名無しさん (ワッチョイ 5b2d-IPSQ) mailto:sage [2023/08/03(木) 17:16:30.77 ID:5KUHoXNc0.net] tiktokなんかjavascriptでVMを実装してその上で独自のコードが動いてるせいで解析が極めて困難になってる
343 名前:デフォルトの名無しさん (ワッチョイ 1746-ZTxv) [2023/08/04(金) 08:54:17.97 ID:4oDPVLgw0.net] >>341 こわっ...
344 名前:デフォルトの名無しさん (スフッ Sd8a-KN61) [2023/08/04(金) 15:45:40.86 ID:GMHK0FTid.net] /* 文字列を反転させる */ #include <stdio.h> #include <string.h> void reverse(char *); void reverse(char *cp) { char *p, *q, wk; p = cp; q = &cp[strlen(cp)]-1; // strlen()は'\0'を数えないのに1引かないと正しく動作しない while (p < q) { wk = *p;*p = *q;*q = wk; p++; q--; } } int main(void) { char ss[] = "Program123456789"; reverse(ss); printf("%s\n", ss); return 0; } 上記プログラムでstrlenは'\0'文字をカウントしないのに、1引かないと正しく動作しないのはなぜですか?
345 名前:デフォルトの名無しさん (スフッ Sd8a-KN61) [2023/08/04(金) 15:49:34.67 ID:GMHK0FTid.net] 343の訂正です q = &cp[strlen(cp)-1]です
346 名前:デフォルトの名無しさん (ワッチョイ 17c9-NYH+) mailto:sage [2023/08/04(金) 15:57:00.72 ID:/AVxr1FX0.net] 末尾の \0 を入れ替えたらあかんやろ "AB" は strlen() == 2 になって 0 1 2 [A][B][\0] こういう配置や
347 名前:デフォルトの名無しさん (ワッチョイ 17c9-NYH+) mailto:sage [2023/08/04(金) 16:03:23.77 ID:/AVxr1FX0.net] strlen は文字数を返す一方で [ ] の中はオフセット量(0スタートの相対距離)だから 1文字目を指すのは オフセット0 の場所なんだわ
348 名前:デフォルトの名無しさん (スフッ Sd8a-rFCo) [2023/08/04(金) 16:09:46.38 ID:GMHK0FTid.net] >>>345 >>>346 即答ありがとうございます 自分はまったく そこまで考えてstlrenを使ってませんでした。ありがとうございます。勉強になります
349 名前:デフォルトの名無しさん (ワッチョイ 17c9-NYH+) mailto:sage [2023/08/04(金) 16:25:43.11 ID:/AVxr1FX0.net] そこまで考えてというか ポインタ/配列添え字 が 0 から始まるだけの話でな 1文字目 = (オフセット)0 2文字目 = (オフセット)1 : n文字目 = (オフセット)n-1 他所言語(特に古めのBASIC) だと配列の添え字は 1から始まるのが自然だから その感覚のままだと およよ? ってなる
350 名前:デフォルトの名無しさん (ワッチョイ be63-1j9t) mailto:sage [2023/08/04(金) 16:33:03.37 ID:h8ImZ1qQ0.net] COBOL, PL/I, RPG, FORTRAN, BASIC, R, Lua, Julia は、1で始まる
351 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b73e-yh3V) mailto:sage [2023/08/04(金) 16:45:56.55 ID:vdf3rEq10.net] BASIC はバリエーションが多いよ。 0 と 1 を切り替える機能があるやつを知ってる。
352 名前:デフォルトの名無しさん (ブーイモ MMe6-rA3N) mailto:sage [2023/08/04(金) 22:18:35.44 ID:3UzK9dfoM.net] >>341 そのやり方だとapple審査通らないのでは?
353 名前:デフォルトの名無しさん (ブーイモ MMe6-rA3N) mailto:sage [2023/08/04(金) 22:23:16.57 ID:3UzK9dfoM.net] 環境はwebkitでvm自体dlしてくるから問題ないということなのか…
354 名前:デフォルトの名無しさん (ワッチョイ e3ad-c/5M) [2023/08/05(土) 14:06:37.50 ID:7Tp3cevL0.net] >>349 Pascal もよろしく
355 名前:デフォルトの名無しさん (ワッチョイ bb01-tyL0) [2023/08/05(土) 21:43:38.19 ID:p8skrLMB0.net] >>353 Fortranは添字の開始値を指定しない場合は1から始まり、添字の開始値を指定する場合は任意の整数 (負も可)を指定できるが、Pascalは添字の開始値指定が必須で任意の整数(負も可)を指定できるから、 1から始まるとは言えない。
356 名前:デフォルトの名無しさん (スプープ Sdc3-EMqx) mailto:sage [2023/08/05(土) 22:05:05.59 ID:Rq9CiLOMd.net] >>350 ああOPTION BASEかあ N88BASICの頃からあるが使ってるの見たことない
357 名前:デフォルトの名無しさん (ワッチョイ e3ad-c/5M) [2023/08/05(土) 23:14:06.26 ID:7Tp3cevL0.net] >>354 そういやそうだった。忘れてた。
358 名前:デフォルトの名無しさん (ワッチョイ c379-IXit) mailto:sage [2023/08/06(日) 12:09:56.49 ID:SuulMMGF0.net] 今時はExcelのセルをCellsでアクセスしたり配列に代入した場合だけ1オリジン固定でちょっと困る 歴史的経緯というよりExcelのCOMオブジェクトの仕様なんだろうけど
359 名前:デフォルトの名無しさん (テテンテンテン MM17-2Tt6) mailto:sage [2023/08/06(日) 13:13:28.45 ID:GDllPCgfM.net] 配列って array + sizeof(*array) * index だから、0からの方が理にかなってると思う 1からの場合は、実行時にアドレスを割り出すときに絶対1引いてるよね… そこまでしても人間の直感に合わせたかったのだろう
360 名前:デフォルトの名無しさん (ワッチョイ ebad-9S8H) mailto:sage [2023/08/06(日) 13:25:15.07 ID:jxDYmhFo0.net] 1引いているのはあくまで内部的なもの それこそ人間の直感に合わせたインターフェイスとコンピュータの都合の良い情報に相互変換するのがプログラムじゃなかろうか 0からのほうが分かりやすいと思うのはプログラマだからだろうし 10個のデータの最後のインデックスは10というのは添え字で考える場合は分かりやすいしね
361 名前:デフォルトの名無しさん (ワッチョイ 7510-WTQk) mailto:sage [2023/08/06(日) 14:09:12.01 ID:VdM0xi000.net] 先頭をゼロと呼ぶか1と呼ぶかならまだマシよ 音楽なんて先頭要素を1と呼ぶだけじゃなく、要素間の差がない事まで、ゼロじゃなく1と呼ぶ 現代人からするとどう考えても頭おかしいが、仕方がない。ゼロの概念がなかった時代から定義が変わらず続いてるらしい
362 名前:デフォルトの名無しさん (ワッチョイ c379-IXit) mailto:sage [2023/08/06(日) 14:15:40.68 ID:SuulMMGF0.net] Cはゼロに限らず何もないを示すvoidが無い頃は全部intでやってた時代もあるんだよ 頭おかしいな
363 名前:デフォルトの名無しさん (ワッチョイ ebad-9S8H) mailto:sage [2023/08/06(日) 14:37:12.68 ID:jxDYmhFo0.net] voidが何もないことを示すならvoid*の存在のほうが気になる
364 名前:デフォルトの名無しさん (ワッチョイ e3ad-c/5M) [2023/08/06(日) 14:59:14.25 ID:RhhSFLLO0.net] void だけ特殊な型と考えるしかないのではないかな。大きさが0ビットの型と考えても良いのかも知れないが。
365 名前:デフォルトの名無しさん (テテンテンテン MM17-2Tt6) mailto:sage [2023/08/06(日) 15:50:27.26 ID:3R7VaRJUM.net] sizeof(void) → 1 だな これって正式な仕様なのか分からんけど
366 名前:デフォルトの名無しさん (ワッチョイ 87cf-n4fA) mailto:sage [2023/08/06(日) 16:40:17.07 ID:Raz9Sh7o0.net] それgccなんかの独自仕様のはず。void*をバイト単位で計算できるから便利なんだけどね。
367 名前:デフォルトの名無しさん (スッププ Sd03-EMqx) mailto:sage [2023/08/06(日) 17:35:17.48 ID:/aV5Am17d.net] それは気持ち悪いな
368 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5b3e-tyL0) mailto:sage [2023/08/06(日) 17:46:22.79 ID:Mgx3ApDu0.net] 言語仕様上は void は不完全型とする扱い、かつ sizeof に不完全型を与えることは出来ない。
369 名前:デフォルトの名無しさん (スッププ Sd03-EMqx) mailto:sage [2023/08/06(日) 17:48:27.27 ID:/aV5Am17d.net] gccだとsizeof(関数名)も1なんでしょ 明らかにただの手抜き
370 名前:デフォルトの名無しさん (ワッチョイ b363-aAN6) mailto:sage [2023/08/06(日) 17:52:12.98 ID:wnylhiXb0.net] 仕様上の問題は置いておいて 1として扱うと何か良いことあるんでしょうか?
371 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5b3e-tyL0) mailto:sage [2023/08/06(日) 17:56:04.37 ID:Mgx3ApDu0.net] 未定義な動作は規格として規格が何ら要求を課さないことを意味するが 但し書きの中に「文書化された環境に特有な方法で処理してもよい」ともある。 GNU C のドキュメントには void と関数 (関数指示子) の大きさについて記述がある。 https://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html これも規格が認める正しい動作のひとつ。 それはそうとして処理系に固有の挙動に依存するのを避けるに越したことは無いけど。
372 名前:デフォルトの名無しさん (ワッチョイ 87cf-n4fA) mailto:sage [2023/08/06(日) 18:03:13.82 ID:Raz9Sh7o0.net] >>369 >>365 にも書いたけど、演算するのにいちいちchar*などにキャストする必要がない。
373 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5b3e-tyL0) mailto:sage [2023/08/06(日) 18:10:14.29 ID:Mgx3ApDu0.net] void* は演算させないという意思表示なこともあるんで 演算できることが良いわけでもないんだけどね。
374 名前:デフォルトの名無しさん (ワッチョイ 87cf-n4fA) mailto:sage [2023/08/06(日) 18:29:53.89 ID:Raz9Sh7o0.net] どんな用途があるかな?デリファレンス先にアクセスできないってだけで十分な気もするが。
375 名前:デフォルトの名無しさん (アウアウウー Sa9f-W3Bx) mailto:sage [2023/08/06(日) 18:36:51.14 ID:mq8IFmf1a.net] 任意に渡ってきたポインタ間の距離?
376 名前:デフォルトの名無しさん (ワッチョイ 7510-WTQk) mailto:sage [2023/08/07(月) 01:08:17.44 ID:zJXXdP4R0.net] アレじゃないかな?メリットあるとしたら 【struct に含めたメンバーは、サイズゼロはダメ】っていう仕様があったかと思う。 正確には【structの違うメンバーが同じアドレスになったらダメ】だったか ---- 以下は蛇足 ただサイズゼロだめってのは例外があって。 structの末尾メンバーでchar[] だか char[0]ってのが、確かC99あたりでアリになった気がする。 これは…それまでも使われてたテクで 【structの最後に char [1] のメンバーを置いて、実際にはメモリ確保の時structのサイズ+可変長部のサイズでメモリ確保し、最後のメンバーを使ってstructのサイズを超えてアクセスする】という慣用句があって、 それの目的で C言語公式仕様風では char[1] と書き 確か昔は gccだとchar[] vcだと char[0] ていう書き方してた。(gccとvcは逆だったかも知れない) のが、公式仕様でもサイズゼロokになった…という話だったかと。
377 名前:デフォルトの名無しさん (ワッチョイ 7510-WTQk) mailto:sage [2023/08/07(月) 01:23:44
] [ここ壊れてます]
378 名前:.93 ID:zJXXdP4R0.net mailto: あ、メリットの言い方をすると 処理系内でstructのサイズ計算を実装するにあたって、あらゆる型がサイズ1以上である事が分かっていれば、合算処理を合理的に実装する事ができる …よね? [] [ここ壊れてます]
379 名前:デフォルトの名無しさん (スッップ Sdd7-EMqx) mailto:sage [2023/08/07(月) 08:18:18.04 ID:SwgOJiZRd.net] 意味不明 メンバーにvoidを含められたとしても参照すればエラーになるはずなので使いようがない (void*はもともと正しいサイズを持つ) unionで似たようなことはできる
380 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5b3e-tyL0) mailto:sage [2023/08/07(月) 09:11:24.17 ID:U9It/DCQ0.net] >>375 サイズゼロをOKとすると言ってしまうと語弊があると思う。 仕様上の理屈だと「不完全型を指定できる」だし、そうした場合の動作は いくつかの特例で成立していて「長さ 0 の配列」は現れない。 sizeof などでは「フレキシブル配列メンバは無視される」だし、 メンバにアクセスするときは > 置き換えられた配列が要素をもたないとき,それはただ一つの要素をもつのと同じ規則で動作する。 > しかし,その要素にアクセスした場合,又はその要素を一つ越えたポインタを生成した場合, > その動作は未定義とする。 とあって、長さ 1 として扱うけど要素にはアクセスするなという回りくどい言い回しになってる。
381 名前:デフォルトの名無しさん (アウアウウー Sa9d-mBaV) [2023/08/07(月) 10:17:41.09 ID:wl/Lx6N5a.net] >>375 typedef struct { int x; char a[1]; } A; A *p = (A *)malloc(sizeof(A) - 1 + N); typedef struct { int y; char b[]; } B; B *q = (B *)malloc(sizeof(B) + N); typedef struct { int z; char c[0]; } C; C *r = (C *)malloc(sizeof(C) + N); かな
382 名前:デフォルトの名無しさん (アウアウウー Sa9d-mBaV) [2023/08/07(月) 10:19:25.16 ID:wl/Lx6N5a.net] >>378 の主張だと typedef struct { int y; char b[]; } B; B *q = (B *)malloc(sizeof(B) - 1 + N); でなければならないのかな
383 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5b3e-tyL0) mailto:sage [2023/08/07(月) 11:05:26.04 ID:U9It/DCQ0.net] >>379 配列の大きさとして 1 を指定して可変長のように扱うやり方については ちょっと不明瞭なんだが仕様に厳密にいうと準拠してない方法だと考えられている。 https://c-faq.com/struct/structhack.html 配列の大きさが 0 より大きくなければならないということについては 例外を見つけられないのでどこであろうと 0 を指定したら未定義と解釈していいと思う。 GNU C では構造体メンバの最後の配列要素に 0 を指定した場合は C99 でフレキシブル配列メンバにしたときとほぼ同じような扱いになることがドキュメント化されてる。 https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html つまり GNU C では 0 を指定していいわけだが……結果が同じならあえてやる必要もないな。 GNU C でも構造体の最後の要素を除いて配列の大きさに 0 を指定するのは (可能だが) 推奨されていない。 アクセスした結果は未定義なのでなんの役に立つのかようわからん。
384 名前:デフォルトの名無しさん (スッップ Sdd7-EMqx) mailto:sage [2023/08/07(月) 11:36:51.88 ID:SwgOJiZRd.net] >>380 -1する必要ないな 1バイト程度なら余計に取っても害はない
385 名前:デフォルトの名無しさん (ブーイモ MMf3-DyKn) [2023/08/07(月) 14:20:51.17 ID:Xd8Y6/QgM.net] >>382 そういういい加減な見積もりは感心しないな それに、この場合は-sizeof(int) が正解だと思う
386 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5b3e-tyL0) mailto:sage [2023/08/07(月) 14:26:13.65 ID:U9It/DCQ0.net] >>382-383 どっちも間違い。 この場合は -1 をしてはいけない。
387 名前:デフォルトの名無しさん (スッップ Sdd7-EMqx) mailto:sage [2023/08/07(月) 20:36:36.16 ID:SwgOJiZRd.net] >>383 いい加減なのではなく無駄なことに神経を使わないのがプログラマの秘訣だ それに他人が見て「この-1はなんだろう?」と無駄な思考時間を取られる可能性を考えたら百害あって一利なしだ >>384 よく見たらデタラメだな すまん
388 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ eb32-oz9p) mailto:sage [2023/08/07(月) 21:06:32.92 ID:+g1cDN8+0.net] >>385 1バイトごときのために余計なことをしないってのは理解できる理屈だが、不必要な1バイトを確保するってのもそれはそれで無駄に考えさせられてしまう感じがする。 やろうとしていることと合致しないコードなわけだから。 害はないが役に立ってもいないということを確信するのはどういう役に立っているのかを見つけるより難しい。
389 名前:デフォルトの名無しさん (ブーイモ MMf3-DyKn) [2023/08/07(月) 21:30:20.59 ID:6YHeZP2fM.net] >>384 ああ、[1]の場合のコード見てたわ、お恥ずかしい。 どっちにしろ[1]の場合もoffsetofかalignof使ってあれこれだね…sizeofじゃ正解ではない…
390 名前:デフォルトの名無しさん (スッップ Sdd7-EMqx) mailto:sage [2023/08/07(月) 22:08:57.23 ID:SwgOJiZRd.net] >>386 どうせmallocは1バイト単位では確保しないので正確なサイズを指定しても構造体一個につき数バイト以上の無駄な領域が確保されることになるし… この構造体を数万個単位で使うような大規模プログラムで極力ムダを避けたいならmallocは使わず最初に大きなリニア領域を確保してそこから切り分けたほうがいいだろう 蛇足だが経験上こういう構造体を使うときはcopy=malloc(sizeof(A) + strlen(src)); strcpy(copy->a,src);のように使うことが多い これなら正確なサイズ指定になる >>387 どっちにしろ君は何か勘違いしてないかな 長ったらしく書くなら-sizeof(int)ではなく-sizeof(char)となる
391 名前:デフォルトの名無しさん (ワッチョイ 7510-WTQk) mailto:sage [2023/08/07(月) 22:21:06.53 ID:zJXXdP4R0.net] どんどん蛇足的になってしまってる気はするが 1バイトの加減算ってのはインクリ・デクリの1命令で演算できるし分岐しないし、 アライメント境界を1バイト超えたらバス幅分-1の無駄ができるかもなので しかも100万個の「3d座標型」とかがその理屈で1個につき7バイト無駄にしたら700万バイトが無駄になるので たかが1バイトと軽視して良いか否かは、状況によります で、はちみつさんのちみつな調査に感謝。蛇足で変な事書いて仕事増やしてごめんなさい
392 名前:デフォルトの名無しさん (ワッチョイ 7510-WTQk) mailto:sage [2023/08/07(月) 22:28:38.60 ID:zJXXdP4R0.net] でも、ワシは(もしそれが有効だと判断したら)公式なC言語仕様上未定義になるとしても、 伝統的にgccとvcが「独自拡張」として許してきた書き方で 書くよ もちろん責任者の許可は伺うけどね ダメと言われたらもちろんやらない
393 名前:デフォルトの名無しさん (ワッチョイ 0547-DyKn) [2023/08/07(月) 22:34:55.16 ID:hZrkDm/B0.net] >>388 ちゃんとサイズ確かめた?そんなに簡単なら[]拡張なんて要らないと思わない?
394 名前:デフォルトの名無しさん (ワッチョイ 7510-WTQk) mailto:sage [2023/08/07(月) 22:36:31.40 ID:zJXXdP4R0.net] で 時には自分が、あるプロジェクトの最高責任者だったりする訳で その環境は特定のカスタムgccの特定バージョンを使うしか選択肢がないから無用な心配は意味がなくて 次のプロジェクトではどうせ全部作り直しだったりする
395 名前:デフォルトの名無しさん (スッップ Sdd7-EMqx) mailto:sage [2023/08/07(月) 22:48:24.16 ID:SwgOJiZRd.net] >>391 何を確かめればいいのかね 正確に書いてくれないと答えようがないな 後半個人的には「要らない」ね 誰かが拡張したら使わないとイケないという「強迫観念」を持ってないか? それは不要なものだよ
396 名前:デフォルトの名無しさん (ワッチョイ 0547-DyKn) [2023/08/07(月) 22:52:47.17 ID:hZrkDm/B0.net] >>393 sizeof(A) != sizeof(int) + sizeof(char)
397 名前:デフォルトの名無しさん (ワッチョイ 0b01-W3Bx) mailto:sage [2023/08/07(月) 23:31:53.12 ID:+QyISSA90.net] >>394 メンバの配置はきっちりつめるのから nバイトアラインで飛び飛びにしてるのもあるしね
398 名前:デフォルトの名無しさん (ワッチョイ 0b01-W3Bx) mailto:sage [2023/08/07(月) 23:39:40.36 ID:+QyISSA90.net] >>395 一番最後のメンバの後ろにパディングが足されるかどうかが焦点になる 足されないならイージーに引き算すりゃいいんだが…
399 名前:デフォルトの名無しさん (スップ Sdcf-YWx9) mailto:sage [2023/08/08(火) 07:56:15.14 ID:QQsYUamCd.net] 引き算とか言ってる馬鹿初めて見たわ
400 名前:デフォルトの名無しさん (ワッチョイ b363-uQHI) mailto:sage [2023/08/08(火) 11:03:00.71 ID:+jW/mKCz0.net] 複素数使って計算すれば馬鹿にされませんよ?