探検


C言語って設計が悪いから難しく感じるだけ

1デフォルトの名無しさん
垢版 |
2026/03/24(火) 10:14:24.22ID:iaVEWJjC
ポインタが難しいわけでもないし、単に分かりにくい設計が諸悪の根源。
2026/05/17(日) 00:21:38.18ID:sZl86DxD
>>231
76H
2026/05/17(日) 08:15:32.05ID:hzDNIoZ4
なぜかC9H(Ret)だけ覚えてる
初見の関数どこで関数が終るのか目星をつけるのは今でも変わらないね
234💾キモバカじじい ◆Rn9d66GbJRuf
垢版 |
2026/05/18(月) 03:58:06.70ID:X5sfaAzO
🎯👈👈👈👈👈
🤜💥ABC💯🌴

↑PCG: Programmable
235💾キモバカじじい ◆Rn9d66GbJRuf
垢版 |
2026/05/18(月) 04:00:32.21ID:X5sfaAzO
🎯👈👈👈👈👈
🤜💥ABC💯🌴

↑PCG: Programmable Character Generator
 ↑by X1シリーズ
236デフォルトの名無しさん
垢版 |
2026/05/18(月) 11:26:46.08ID:5A1Ebijf
>>224
https://www.amazon.co.jp/dp/477411328X
2026/05/18(月) 12:01:12.39ID:jQf+jbSy
voidさんの本か
読んでみたいような読みたくないような
2026/05/18(月) 21:43:34.88ID:GU18Es67
止めとけ
本がでた頃に2chに本人がきたけど本の内容酷評されたりおちょくられたりで撃退されてたw
2026/05/18(月) 22:44:51.38ID:3S4Q09d6
1. Effective C
2. Modern C
3. SEI CERT C Coding Standard

Effective Cは第2版がModern Cは第3版が出てる
SEI CERT C Coding StandardはWebで読める
2026/05/18(月) 23:47:15.86ID:zqbhNErD
おすすめ情報元紹介ありがとうございます。
英語文献はブラウザで翻訳できるところは読むようになりました。洋書を読む方は自分で翻訳ですか、すごいですね、、、
2026/05/20(水) 00:32:16.01ID:K4ijhElN
俺はCをやるにあたって「はじめての8086」を読めと言われた
「はじめての486」も併せて買ったけど積ん読した
2026/05/20(水) 00:39:25.62ID:7EfSCYUZ
6502がいちばんおもしろかったなぁ。
2026/05/20(水) 00:45:15.30ID:iGvoShit
初めて読むマシン語、8086、486ナツカシス
244💾キモバカじじい ◆Rn9d66GbJRuf
垢版 |
2026/05/20(水) 01:23:44.91ID:aoS52wMR
4004で電卓戦争やってた人いますか?
245デフォルトの名無しさん
垢版 |
2026/05/20(水) 10:35:47.92ID:VmWwNsDH
これのひとかな
https://www.youtube.com/watch?v=Kx0pVrx2TRw
2026/05/20(水) 21:23:12.52ID:Z0u59BFL
>>242
だがCをインプリメントするとしたら最悪なCPUだよなあ
2026/05/20(水) 21:45:21.76ID:ZgHSF/QP
>>246
ゼロページが変数として使える最強やないか
248デフォルトの名無しさん
垢版 |
2026/05/23(土) 13:44:55.22ID:ULl5YR4s
09良いよね
http://www.st.rim.or.jp/~nkomatsu/mc680x/MC6809.html
2026/05/23(土) 19:04:49.27ID:p40Ic9M9
ざいろぐちゃん
もすちゃん
もとらちゃん
250デフォルトの名無しさん
垢版 |
2026/05/23(土) 21:41:01.42ID:skqHV7XZ
Abstract Data type(ADT)を使ってstackとqueueを、固定長配列、動的配列、linked listで書く演習をやっている。逆ポーランド記法の電卓とか括弧の対応が正しいかというやつ。コードを読めば一応わかるけど一から書けといわれたら無理。stackとqueueは3種類の方法で自在に書けないと試験合格は難しいらしい。もう、6パターンまる覚えするためにひたすら書いているけどいちいちmakeするのが面倒くさい。
来週からはビット演算。そのあとI/Oと標準/数学ライブラリとやって、これでCは一旦終わり。後期からはアセンブラ。どんどん難しくなるんだけど方向性が情報系とは逆な気がする。あっちはあっちで大変そうだけど。
2026/05/23(土) 21:57:34.46ID:TIyii4ui
へー、高度なことやってるねー。MIT系の教科書かなぁ。
2026/05/23(土) 22:13:45.25ID:fvZ+wgIe
なんか80年代の教育内容だね
Secure Codingについては学んでるんだろうか
253デフォルトの名無しさん
垢版 |
2026/05/23(土) 23:18:15.41ID:YY7E06NG
Securityについては、interface(ヘッダ)とimplematation(.cの実体)を使って、high cohesionとlow couplingを意識しろくらいことしか学んでないです。もっと高度なやり方があるんだと思いますが、今のところ応用まで手が出ないです。。。
2026/05/23(土) 23:29:27.66ID:j4Q0q/xv
それはまあCの普通の書き方というか昔々からのよくある設計の方針みたいな話で、セキュアコーディングとは何ら関係ない
本質的にはCに限った話でもないし、もっと言えばその回答は何も言ってないのと同じくらい内容がない
大体ヘッダとソース使ってってCならそらそうだろw
255デフォルトの名無しさん
垢版 |
2026/05/23(土) 23:41:36.02ID:mQjs53zr
セキュアコーディングという私の知らない概念かあるんですね。これから習う内容に入っていれば良いんだけど
256デフォルトの名無しさん
垢版 |
2026/05/23(土) 23:46:06.27ID:gde19rTM
メモリを直接操作できる故の話よね
いうてOSやマシン語の知見も必要だし人間が気をつけるにも限界があるから
現実的にはコンパイラや周辺ツールを活用するのが常套(いまならAIもある)
体系だって学ぶ以上に指摘くらって得るものが大きい
257💾キモバカじじい ◆Rn9d66GbJRuf
垢版 |
2026/05/23(土) 23:52:28.24ID:cAwIaPoW
構造体型のtypedef宣言とそれを操作する関数のプロトタイプ群をヘッダで宣言してエクスポートする。実体はソースに書く。継承なしのカプセル化であり「データ抽象化」と呼ばれるものである。
258デフォルトの名無しさん
垢版 |
2026/05/23(土) 23:54:43.44ID:CG4aH5xK
error handlingて項目が今後の項目にあった。assert.hやsignal.hなど。これがセキュアコーディングの入り口かな? 今はここまで手を広げられないけど
259デフォルトの名無しさん
垢版 |
2026/05/24(日) 00:04:44.66ID:tzxvC/3+
いまはいったん忘れていいよ
後期でアセンブラ着手しだしたら
毎日のようにある脆弱性のニュースと頭の中でつながるから
260デフォルトの名無しさん
垢版 |
2026/05/24(日) 00:10:43.42ID:PG7LhSHM
>>257
ADTの前方宣言の構造体(incomplete)てやつですね。まさに写経中。freeするのがムズイ。別の関数でmallocしたのをきちんと順を追ってfreeしてやるのが難しい。意識せずにできなきゃいけないんだろうけど。パターンだからそのうち覚えられるかなあ
2026/05/24(日) 00:33:21.14ID:YAn8aOoG
解放を忘れたり解放して場所を指したまま使ってしまったり人間はミスをする
特に複雑化して込み合ってくると見落としてミスる
だから現実にセキュリティホールなどが知らぬ間に生じて発見されて悪用されてきた
今はメモリ管理など含めた多くの問題の安全性を言語レベルで保証してくれるRust言語が登場したから移行できるなら移行すべきだけどね
262💾キモバカじじい ◆Rn9d66GbJRuf
垢版 |
2026/05/24(日) 01:53:35.07ID:fAG7NgfK
>>260
異なる型の2つの構造体が相互にリンクを持ち合う時、そして俺の知る限りその時にのみ、構造体のタグによる前方参照が必要。

他は別にtypedefした構造体を普通の型としてインスタンスを宣言するだけ。newは芋蔓式に次から次へと下請けのnewを呼ぶだろうしdeleteも同様。

頑張れ。
263💾キモバカじじい ◆Rn9d66GbJRuf
垢版 |
2026/05/24(日) 02:31:18.42ID:fAG7NgfK
ある構造体を型としてtypedefしようと思えば、もしそのメンバーとして別の構造体型が用いられていればその構造体型もその時点でtypedefされていなければならない。それをするためにはその別の構造体型のtypedefが行われている別のヘッダをインクルードするのが普通で、それは芋蔓式のインクルードになる。ヘッダの多重インクルード対策は簡単なので問題は起こらないと思う。
264💾キモバカじじい ◆Rn9d66GbJRuf
垢版 |
2026/05/24(日) 02:37:41.10ID:fAG7NgfK
ていうかC++もそうでしょ?
2026/05/24(日) 12:03:35.04ID:xUBIupda
typedef struct { A a; } B;
typedef struct { int i; } A;
266デフォルトの名無しさん
垢版 |
2026/05/24(日) 12:06:00.15ID:xUBIupda
struct A_;
typedef struct { struct A_ a; } B;
typedef struct A_ A;
2026/05/24(日) 13:09:36.52ID:s4jEs3HF
>>265 >>266
コンパイラがBのサイズを決めるために必要なAの定義を先にしてあげよう
2026/05/24(日) 13:22:13.47ID:Qix84Ywx
// とあるソース.c
#include "B.h" // Bを使いたい
  ┗#include "A.h" // BはAを使うのでB.h内部でA.hをインクルードする
#include "A.h" // すでにB.hのなかでA.hがインクルードされているのでインクルードガードにより重複よみこみされない
2026/05/24(日) 13:37:30.43ID:Qix84Ywx
// 相互参照はインクルードでは対応できないで前方宣言する
struct B;
struct A { …, B *b, … };
struct B { …, A *a, … };
270💾キモバカじじい ◆Rn9d66GbJRuf
垢版 |
2026/05/24(日) 13:46:03.43ID:fAG7NgfK
こんな感じにできない?(うろ覚え)

typedef struct tag_1
{
struct tag_2* ptr2;
} Type1;

typedef struct tag_2
{
struct tag_1* ptr1;
} Type2;
2026/05/24(日) 14:59:47.15ID:/jkmbLum
オンラインのコンパイラでしか試してないけどC++も
class A { class B *b; };
class B { class A *a; };
みたいな記法は許容されてるな
Cはtypedefしないと毎回structが必要になるから省略できるC++とは標準スタイルが違いそう
272デフォルトの名無しさん
垢版 |
2026/05/24(日) 22:21:11.99ID:h/YQfM5+
C言語が難しいなんて思うやつは、C++を少しでも知ったら発狂して自殺しそうw
273デフォルトの名無しさん
垢版 |
2026/05/25(月) 09:43:47.28ID:a1IT/WC2
>>270
こういう書き方大っ嫌い
2026/05/25(月) 12:27:59.47ID:ZVLpVWSF
後方参照を許さないC言語が時代遅れなことに気づかないとな
Cコンパイラしか提供されない組み込み環境なら仕方ないが
そうでないならC言語を今すぐ捨てるべきだ
275デフォルトの名無しさん
垢版 |
2026/05/26(火) 19:02:11.19ID:4AYldPgi
>>274
C言語はUNIX用のプログラミング言語なんだが?
276デフォルトの名無しさん
垢版 |
2026/05/26(火) 22:23:22.62ID:/r0Ypo2p
x 設計が悪い
o 設計がシンプル
2026/05/26(火) 23:21:22.65ID:GWUdZZ4M
設計が悪いも何も、ポータブルなアセンプラとして計算機に寄り添う形で設計してあって、それは今も変わらないのでは
今となっては古いと言われればそうかもしれないけど、古いことは別に何も悪いことじゃない
2026/05/27(水) 08:17:35.98ID:08gSGm1k
アセンブラはカッタルイからこんなん作ったよ
なレベルの言語に文句言ってもなぁ
2026/05/27(水) 09:54:13.42ID:sb5fUGY6
もともとのC言語はハードウェアの性能を100%出せることを前提に設計されているから
機種依存がわんさかとある言語
280デフォルトの名無しさん
垢版 |
2026/05/27(水) 10:10:20.11ID:088jDWOf
>>279
UNIXの仕様を想定して作られたC言語は、別のOSでは前提条件が違っていて勝手にC言語を移植されて問題になった。
281デフォルトの名無しさん
垢版 |
2026/05/27(水) 10:13:32.14ID:zw6fajFz
アセンブラがかったるいからと言って
{とか
}とか
=>とか醜い表現使うなっての
2026/05/27(水) 11:03:05.79ID:sb5fUGY6
自分の知らないC言語のようだ
2026/05/27(水) 11:13:41.19ID:vt0HUY+p
#define begin {
#define end }
2026/05/27(水) 13:28:13.51ID:B9J/OP7Y
ゲーッ。17章も参照のこと。
2026/05/30(土) 01:28:49.19ID:Jsn+beB5
begin/endをdefineするのは懐かしいなぁ。
やったよねぇ、Pascal風の言語にしちゃうやつ。
おれはstructuerにfunction入れてsmalltalk風に使ってた。C++できる以前。
2026/05/30(土) 07:01:10.70ID:m3T0RFG6
プリプロセッサの素晴らしく駄目な使い方だな
2026/05/30(土) 09:48:01.35ID:XQCyRiRg
comp.lang.cのFAQに載るくらいだから>>283とか>>285みたいのは昔から腐るほどいたんでしょ
バカというかセンスがないやつに道具使わせるとどう使うかっていうよくある例だわな
2026/05/30(土) 10:50:22.35ID:Jsn+beB5
pascal風の簡易DSLをヘッダーだけで作成して、
最上位の業務階層は、簡易DSLで保守。
pascal部隊もいたので。
2026/05/30(土) 11:01:27.30ID:Jsn+beB5
可読性の問題だよねぇ。C言語でも効率より可読性をとれば、わかりやすくはなる。
だけど高級アセンブラなので、効率がよく可読性の高い「設計と構築」が求められる。
2026/05/30(土) 11:10:01.49ID:Jsn+beB5
プリプリプロセッサを作らないならば、
プリプロセッサだけで効率と可読性を求める。
291デフォルトの名無しさん
垢版 |
2026/05/30(土) 11:17:37.55ID:lVeD90kH
ラダー回路が最高
292デフォルトの名無しさん
垢版 |
2026/05/30(土) 12:08:02.72ID:U80OJ//1
初期のC++がただのプリプロセッサだったというのは皮肉
293デフォルトの名無しさん
垢版 |
2026/05/30(土) 16:06:18.89ID:x3RS+DzD
ポインタと配列の違いとかまあ微妙だわな。全部ポインタでええやろとは思う
2026/05/30(土) 17:23:34.48ID:QKLBXZIC
さらにポインタはintの使い方の一つという扱いで補って、あれアセンブラのままがシンプルでよかったかな?
295デフォルトの名無しさん
垢版 |
2026/05/30(土) 19:05:09.28ID:fcUvegOR
intじゃ代替出来んわな
2026/05/30(土) 19:22:21.90ID:QKLBXZIC
ちょっと厳しかったですか
やっぱりポインタが持つ型というものは、生成コードに間接的にしか表れませんが偉大ですね
297デフォルトの名無しさん
垢版 |
2026/05/30(土) 20:00:52.87ID:OeNHKzAz
まあunsigned charとかintとか設計悪いよな
i8 <- 8bit符号あり整数
u64 <- 64bit符号なし整数
な感じで、i8/i16/i32/i64、u8/u16/u32/u64、f32/f64とかでええやろ
ポインタ型も最初からpi8/pvoidみたいなの使えるようにしとけ
構造体やクラス(C++)もあるから*は必要だが
298デフォルトの名無しさん
垢版 |
2026/05/30(土) 20:57:47.70ID:XFlMbqow
>>297
C言語はUNIXを作るために作ったと何度、言われればわかるのか?
2026/05/30(土) 21:34:36.66ID:m3T0RFG6
メモリが56KBとかのマシンで作られた言語だからな
仕様なんて必要最低限しかない
2026/05/30(土) 21:53:42.53ID:m3T0RFG6
もともとの仕様な
2026/05/30(土) 22:33:31.82ID:fcUvegOR
こういう>>297みたいな「dmrより俺の方が分かってる」みたいな手合いって世界中にいるんだろうな
誰かのやった仕事に対して何十年も経った立場からキャンキャン吠えるとかそんな恥知らずなマネよく出来るなw
2026/05/31(日) 00:13:03.27ID:A0lcmmAm
仕様の解釈に柔軟性を持たせたから今でも現役で残っているとも言える
2026/05/31(日) 11:59:55.21ID:iw1445Th
>ポインタ型も最初からpi8/pvoidみたいなの使えるようにしとけ
>構造体やクラス(C++)もあるから*は必要だが
矛盾してるな
構造体aのポインタをpaとするルールを入れろと言ってるようなもの
それなら*aと何も変わらん
304デフォルトの名無しさん
垢版 |
2026/06/01(月) 05:02:59.72ID:nDSJqHbn
結局上流の仕様を深く考えられる俺たちがC言語設計しとけばだいぶ世の中変わったよなあって話だな
ポインタ一つとってもvoid*でポイドポインタにキャストできる利便性と引き換えに本来の型情報喪失っていう致命的なミスしてるしメモリバグの要因になってる
当時の人は何を思ったのやら
2026/06/01(月) 07:31:28.81ID:HZwAN0EX
だから、アセンブラ直接使いたくなかっただけだから
変数の型なんてレジスタの延長としか考えて無いんだよ
2026/06/01(月) 07:36:06.85ID:RuL1T6Db
Cコンパイラしかない組み込み環境でないのならC言語を今すぐ捨てろ
ちゃんとした強い型付け言語を使え
307デフォルトの名無しさん
垢版 |
2026/06/01(月) 08:28:53.94ID:Um4FaBea
むかし某旧帝大の講義でヌルポインタを全ビットゼロのポインタのことだとか説明してるのを聴いたときは
所詮日本ってこの程度なんだなあとガッカリしたな
2026/06/01(月) 09:15:17.64ID:Y8Ze0X4r
>>307
初期のCの時代にはそれで合ってるよ
ヌルが特別な状態を示す様になったのは
最近だろ?
2026/06/01(月) 09:28:24.03ID:UpLtcaM+
>>307
当時は合ってる
全bitが0のバイトで文字列の終端もしくは文字がないことを表したり
全bitが0のアドレスでポインタ列の終端をもしくはアドレスがないことを表していた
2026/06/01(月) 09:43:30.17ID:2Fig2KkG
#define NULL ((void *)0)
だもんなあ

しかし、アドレス 0 が有効なアドレスであるシステムならまた違った値になっているだろう
2026/06/01(月) 10:53:28.39ID:zavtC8M7
#define break exit(-1)
2026/06/01(月) 12:41:39.70ID:z7Brjm4N
>>306
Rustと以外でおすすめある?
313デフォルトの名無しさん
垢版 |
2026/06/01(月) 12:43:04.75ID:orNocmRO
>>310
なんとあるんだよな
組み込みの場合な、RAMが先頭に配置とか
ブートモード設定でアドレス空間を選択できたりするんだが、その中で選べるから怖い
セクション割り当てなきゃいいんだけど
2026/06/01(月) 12:45:46.65ID:Y/faLFgX
CPUのアーキテクチャ次第だからヌルポは0じゃ無くて定義次第
315デフォルトの名無しさん
垢版 |
2026/06/01(月) 12:46:30.75ID:orNocmRO
>>314
なるへそ
316デフォルトの名無しさん
垢版 |
2026/06/01(月) 13:08:32.64ID:Um4FaBea
すごいな惨憺たる感じだな
>>308-310,314とバカばっかりじゃんかw
まじてFAQくらい読んだ方がいいよそんな知識なら
2026/06/01(月) 13:15:11.22ID:Ud3VbC+T
>>314
CPUのアーキテクチャは一切関係ありません
各プログラミング言語の取り決め次第です
使わないと決めたアドレス値を特別扱いして無効アドレスとみなして取り扱っているだけです
2026/06/01(月) 13:29:41.12ID:Gju4oLNk
>>317
あ?
どんなCPUで動かすコード吐くのかが一番大事だろw
机の上だけでニンマリするだけならいいけどなw
2026/06/01(月) 13:58:22.88ID:Ud3VbC+T
>>318
C言語の規格書 ISO/IEC9899 にて
NULLポインタは値0と定められています
CPUアーキテクチャとは一切無関係です
プログラミング言語Cが定めているためどのCPUアーキテクチャにおいても同じ値0です
320デフォルトの名無しさん
垢版 |
2026/06/01(月) 14:44:22.09ID:4HzhGRP/
>>319
これ
昔は不定で後に0として定義された
だから何人かは反対のこと書いてる
2026/06/01(月) 15:00:03.91ID:1czkfGd6
ゼロ番地にアクセス出来ないとかモトローラ系とかディスってる?
2026/06/01(月) 20:01:08.52ID:2Fig2KkG
>>319
どのCの規格書だ?C89、C99、C11のドラフトっぽいもので確認すると
stddef.h の所で以下のように記述されている

The macros are
NULL
which expands to an implementation-defined null pointer constant; and ...
323322
垢版 |
2026/06/01(月) 20:29:11.18ID:2Fig2KkG
すまぬ
C11の 6.3.2.3 Pointers の 3 に以下の詰があった
確かに 0、もしくは void * にキャストされた 0 だわ

An integer constant expression with the value 0, or such an expression cast to type
void *, is called a null pointer constant.
324デフォルトの名無しさん
垢版 |
2026/06/01(月) 20:41:19.52ID:zG8I8hLe
C11まだ導入してないな
C99には移行したけど
2026/06/01(月) 20:46:31.22ID:OMUIYmd4
>>308-310 >>314
まずポインタが現れるべきところに書かれた0が具体的な数値型の値やアドレスじゃなく、ただのシンボルってことは分かってる?
シンボルだから0でも1でも9999でもnilでもどう決めてもいいんだが、Cは0を選んだってだけの話なんだけどな
具体的なメモリの番地がどことかそれが番地を数値で表記できるアーキテクチャなのか、そうでない例えばタグ付きアーキテクチャみたいなのかとか内部表現はどうでもいい
これが分かってないなら悪いこと言わんからイチから勉強し直した方がいいよアタマ悪すぎて話がループして結局FAQと同じ結末だから
2026/06/01(月) 20:50:25.71ID:A/7+PPzR
>>325
数値0と定められている
2026/06/01(月) 22:32:22.49ID:zavtC8M7
ほんまかいな!?
2026/06/01(月) 22:49:47.77ID:2Fig2KkG
>>325
ただのシンボルだという事は知らなかったわ
実装依存の話だが、仮想記憶のあるモダンOSならユーザーアドレス空間の0ページ目は潰しておいて
ページフォールトが発生するようにしているから、内部でもNULLは0にしているのがほとんどだろう
2026/06/01(月) 23:43:43.01ID:J16IyJIp
null pointer constantとnull pointerは別のもの
2026/06/02(火) 00:24:25.45ID:LrQcnY0k
>>325
嘘つくなよ
シンボルではない
明確にinteger 0と決められている
ISO/IEC9899/1999の6.3.2.3を見ろ
331デフォルトの名無しさん
垢版 |
2026/06/02(火) 02:23:41.62ID:mtjv5G02
整数0をnullポインタとするがnullポインタのビット表現は全ビット0とは限らない
となっているけど今現在nullポインタのビット表現が全0でない処理系は一つも存在しない
レスを投稿する


ニューススポーツなんでも実況