C言語なら俺に聞け 156

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 9bb7-/QqT)
垢版 |
2020/09/28(月) 14:41:30.00ID:QxfbhGyV0
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.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言語なら俺に聞け 155
https://mevius.5ch.net/test/read.cgi/tech/1589120427/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2020/12/25(金) 20:30:05.07ID:EiswCiht0
そんなこと言い出したら
ローカル変数だってスタックじゃないかもしれない
2020/12/25(金) 20:39:01.52ID:MidTJiO80
どこにあるかよりどれだけ生きているかの生命期間が大事ね
2020/12/25(金) 21:22:39.71ID:EiswCiht0
速度も
2020/12/25(金) 21:23:50.85ID:EiswCiht0
生命期間も実際はC言語の文法通りじゃない
2020/12/26(土) 05:33:54.37ID:ekLZAtHZ0
>>361
> 7.20.3.3 malloc 関数
> 機能 malloc 関数は,大きさがsize であるオブジェクトの領域を割り付ける。

領域とは連続した区間をいう
2020/12/26(土) 07:58:20.12ID:J4yOWW3+0
メモリ(DRAM)上は連続してるとは限らない
C言語上連続として扱えるというだけ
2020/12/26(土) 08:19:43.84ID:ekLZAtHZ0
それを言うなら仮想記憶だろ
ページ境界をまたぐ場合実記憶が連続しているとは限らない

その昔、ビット幅1bitのDRAMを8個パラってるのがあったけど
だから何って話
それ言い出したらメモリセルのキャパシタは隣接してるのか
2020/12/26(土) 08:29:01.69ID:hSiLuJt/d
スレタイの俺って誰ですか?
2020/12/26(土) 09:41:05.55ID:Mx49Y/J60
>>373
> それ言い出したらメモリセルのキャパシタは隣接してるのか
してないよ、アドレス線が入れ替わってる
なのでメモリーテスターはアドレス線を入れ替える機能がついてたりする
2020/12/26(土) 10:40:07.64ID:IfMxsBFTd
>>366を言い出したからまねして見ただけ
2020/12/26(土) 12:41:26.45ID:0+ArpHnq0
実記憶も連続していない
時々意識不明になってるはず
ただ、その時の記憶がないだけ
2020/12/28(月) 07:49:35.18ID:LdveQEJ20
面倒くさい、特異な、一般人には無縁の仕様を考慮するのが当たり前って感じに持ち出して否定するから初心者が逃げていく・・・。
2020/12/28(月) 08:44:26.16ID:G7B9oAoL0
Cでプログラミングする時に領域の連続性を気にするのは果たして初心者なのだろうか(´・ω・`)
2020/12/28(月) 09:28:54.37ID:Q5Pp+CI0a
Cでどのくらいできれば
実際役に立つレベルでしょうか?
2020/12/28(月) 09:45:26.51ID:ErVwTltE0
>>380
Cは言語仕様は小さいし重要なのはC自体が使えることではなくCを使ってその先で何をするかだから、C言語自体の基本的な仕様は完全にマスタしてるくらいでないとわざわざCを使う意味はないかなと思う
382デフォルトの名無しさん (ワッチョイ c38c-fXGD)
垢版 |
2020/12/29(火) 06:32:49.03ID:NanqjdNB0
iZ-Cのサンプルプログラム書き始めたので見てね。
https://sunasunax.hatenablog.com
2020/12/29(火) 08:44:05.91ID:gCTQzk+K0
>>379
デバイスドライバのぉ バッファをぉ 確保するときとかぁ
ドキドキしちゃうぅ 初心者ですっ❤
2020/12/31(木) 07:46:12.94ID:mJm7tBE2d
>>361
mallocはNULLを返すこともあるので
その場合は当然連続性は保証されない
そのエラー処理も書いておかないといけない
2020/12/31(木) 07:51:45.82ID:/Sdg/sCQ0
mallocがNULLを返した場合は
割り付けが行われていないので
連続でも不連続でもない
2020/12/31(木) 07:55:07.88ID:/Sdg/sCQ0
配列は連続領域が前提だから
E1[E2]が*(E1+E2)と等価となる

構造体も連続領域が前提だからこそ
配列にすることができる

不連続領域はリストや二分木などで
むろん言語自体が提供するのではなく
言語を使ってプログラマが構築するものだ
2020/12/31(木) 12:57:09.96ID:mJm7tBE2d
>>354
さらに言うなら
グローバル配列はコンパイル時に総数を決定しなければならないが
ローカル配列とmallocを使った場合は
最初に人数を入力し、それに合わせた数の名前配列を確保するような作り方ができる
ただしあまりにも大きいとローカルはスタックが溢れるしmallocはNULLを返す
2020/12/31(木) 18:54:42.23ID:/Sdg/sCQ0
mallocがNULLを返すのを実際に目撃したやついる?
malloc(2147483647)みたいなわざとらしい実験じゃなく実用で
2020/12/31(木) 19:17:26.57ID:lvvsunYH0
いますよ。
2020/12/31(木) 19:34:52.29ID:1/HNqY6i0
目撃とかはよーわからんけど実用プログラムだとアロケーション失敗でログ採ったりしてるからそういうログは見たことあるよ
2020/12/31(木) 20:41:44.50ID:+fx38Mty0
仮想記憶とか無いOSだとあっさり NULL 返してたな
2020/12/31(木) 23:27:44.16ID:xpX6Z+OE0
その質問を見てふと思ったことがあるんで便乗質問。
純粋にメモリが足りない (断片化で連続領域がないという場合を含む) という以外で malloc がエラーを返すことってある?

バッファオーバーランとかでめちゃくちゃに書き換えて管理の整合性が壊れたとかいうのは無視して
あくまでアプリケーションとしては C の仕様に則っているという前提で。
2021/01/01(金) 00:09:31.83ID:E41TLeHr0
組み込みのちっちゃなマイコンなら普通
2021/01/01(金) 00:12:43.64ID:mwYi2zym0
マルチスレッドでヒープ領域が排他制御で使えないってのはありうる?
2021/01/01(金) 00:20:48.66ID:E41TLeHr0
さあ
2021/01/01(金) 00:21:33.85ID:FRLcRufg0
吸い込んでくれ
2021/01/01(金) 00:34:01.79ID:ufA+vsC20
>>392 メモリクォータ違反とか?
2021/01/01(金) 00:36:53.19ID:cLHhn9Dx0
>>394
「malloc マルチスレッド」で検索すれば?
知らんけど。
2021/01/01(金) 01:47:49.68ID:gWHeIT9l0
>388
Win98か2000の頃にあったわ。
1kバイトぐらいのを数万回(ファイル数)mallocやろうとしたらNULL返した。
XPで試したらエラー出なかったけど。
2021/01/01(金) 05:55:11.31ID:ihSnxU6O0
逆にメモリ不足以外でNULL返すことってあるのか?
2021/01/01(金) 06:25:04.97ID:DIBn3EXs0
malloc(0)とか
2021/01/01(金) 12:48:57.97ID:U0IfpguFd
malloc(負の数)も
2021/01/01(金) 15:48:48.11ID:1v7huw3N0
負数は単に符号なしで評価してとんでもなくでかい領域を要求してるだけ?
2021/01/01(金) 21:47:45.23ID:DIBn3EXs0
だね
2021/01/01(金) 22:22:16.08ID:wEvOepYPd
sizeof(struct)*numとかごちゃごちゃ書くうちにうっかり0や負数になって…
というのはよくあった
406デフォルトの名無しさん (ワッチョイ dd5f-Jh9r)
垢版 |
2021/01/02(土) 11:42:56.15ID:QsP+Nlmq0
forループでunsignedで<0やって終わらないバグとかもあるな
2021/01/03(日) 00:53:19.09ID:ERUOHNUN0
>>406
それは正しい挙動じゃないかな。
強いて言えば、おせっかいでwarning出せばいい程度かと。
2021/01/03(日) 11:06:33.61ID:QdF5iATA0
>>407
正しい挙動 ≠ 想定した動作
2021/01/03(日) 11:12:17.27ID:3NmY3eCcd
この条件は必ずTRUEになりまっせー
というwarningはあったと思う
410デフォルトの名無しさん (エムゾネ FF62-Jh9r)
垢版 |
2021/01/03(日) 11:41:35.97ID:TDgWBZToF
<0は終わらないじゃなくて始まらないの間違いだった
2021/01/03(日) 13:51:43.57ID:3NmY3eCcd
unsigned int a;
for( a = 11; a > 0; a -= 2 ) ...

こんな感じのを作ってしまったことはあったな…
aは1のあと65535になるので永久に終わらず
aは0になる可能性もあるので条件式ではwarningも出ず
2021/01/03(日) 14:28:17.87ID:izXBuwpQd
>>407
#defineの値によって警告でちゃうから
おせっかいイラネ
413ビル・ジョブズ (ワッチョイ 8101-r+GE)
垢版 |
2021/01/04(月) 00:09:11.84ID:V9PboY9+0
mallocとか常に成功を返すんじゃない?
問題はそのアドレスに何か操作をした時。
MMUありの前提だけど。
2021/01/04(月) 00:29:40.79ID:NWAwlt7F0
実行してみないと使えるか分からないとなると
医療関係では使用禁止になるな
2021/01/04(月) 01:03:06.31ID:PMQqdXD/0
validation 通らないだろうねぇ
2021/01/04(月) 07:24:09.81ID:Nz2iXOdN0
>>413
メモリーオーバーコミットの話をしたいんだろうけどLinuxとかでも設定によるし>>414の言うように医療やECU等のようにそんなもんが許されない組込系の機器もあるから環境によるとしか言えんわな
417デフォルトの名無しさん (ワッチョイ dd5f-Jh9r)
垢版 |
2021/01/05(火) 12:05:40.60ID:G8BimKKu0
宇宙関係も無理やろね
2021/01/05(火) 12:12:18.79ID:8w5sr2J0d
失敗が絶対に許されないならmallocとか使うな
スタティックで確保しろ
2021/01/05(火) 13:27:41.97ID:zIEcR2TW0
一つのファイルポインタで読み書きする場合、読みと書きを切り替えるときに
fseek(fp,0,SEEK_CUR)等を挟むことはANSI Cにも書いてるわけですが、
挟まなくていい環境(Linuxとか)もありその実装上の違いってどうなってるんでしょうか?
バッファゼロにしてもfseekが必要なので、バッファリングってわけでもなさそうです。
420デフォルトの名無しさん (ワッチョイ c2a5-dZT0)
垢版 |
2021/01/05(火) 13:36:43.08ID:sz7Oy+6E0
https://github.com/gcc-mirror/gcc
ここからwindowsのfseekとlinuxのfseekを見つけ出す
2021/01/05(火) 14:23:40.55ID:N7gEH2Zs0
C の規格では OS とかの支援のない 「フリースタンディング」な環境にも言及していて、
フリースタンディング処理系は標準ヘッダ
float.h
iso646.h
limits.h
stdarg.h
stdbool.h
stddef.h
stdint.h
の内容に限定した機能が用意されてればよいことになってる。

malloc は stdlib.h だから無くても規格合致フリースタンディング処理系と名乗れる。
2021/01/05(火) 16:33:30.17ID:9HicEvTUd
>>413
あり得ない
malloc()で==NULLテストして「メモリーが足りません終了します」とかする事はできるが
確保した変数に読み書きした瞬間のエラーは感知する方法がないので
そこでエラーにされてもコアダンプして終了するしかない
ユーザー側から見たら未完成プログラムである
2021/01/05(火) 16:45:24.18ID:7nbNqUCud
ユーザーからしたら
エラーメッセージを出そうが突然死だろうが
メモリが足りなくなる事自体不完全プログラムだ

エアバッグが作動するときに、
[メモリ不足で動作できませんでした]
なんて表示されても何の意味もない
2021/01/05(火) 16:47:22.16ID:N7gEH2Zs0
>>422
やっとる (環境も多い) やろがい。
2021/01/05(火) 17:03:07.78ID:9HicEvTUd
>>423
それなら「エアバッグの数が多すぎるんだな」とか推論できるが
なんのメッセージもなく作動しなかったらユーザーはスピードメーター、ショックセンサー、安全装置などあらゆる関連部分を点検しなければならない
2021/01/05(火) 18:07:14.87ID:dzUtU5Ds0
そんな事はユーザーからすればどうでもいい
不完全な事にはかわりない
2021/01/05(火) 18:09:46.84ID:9HicEvTUd
ソフト作ったことない人だねw
メッセージの有無はバグが起きたときの対処に大きな違いがある
2021/01/05(火) 18:13:12.71ID:dzUtU5Ds0
メッセージの有無なんかよりも
動作するかどうか
の方がはるかに重要

メモリ確保が失敗する可能性があるところで
失敗が許されない動作に対してmallocを使うのが間違い
2021/01/05(火) 18:15:35.99ID:dzUtU5Ds0
適切なエラー処理をすればそれで十分
ソフト設計者のしたっぱの発想
430デフォルトの名無しさん (ワッチョイ 468c-qdLU)
垢版 |
2021/01/05(火) 18:35:11.65ID:zMZuOoIk0
>>423
読む人がいないならメッセージも無意味.
2021/01/05(火) 18:47:10.76ID:oFYQTpSv0
確保できないと返ってくれば対処方法はあるだろう
OK返されたあと、実際に使おうとしたら実はってなると
その分リカバリーが複雑になる
2021/01/05(火) 19:00:03.87ID:K71kt7oj0
ここの人はOOM Killerも知らんのか?
確保したプロセスが死ぬとは限らんのだが…
https://reboooot.net/post/kernel-params-related-to-oom-killer/
2021/01/05(火) 19:39:22.64ID:eT+iPfAP0
確保しようとしてエラーになったなら対処のしようもあるが、空手形乱発していざとなったら
関係ないプロセスが殺されるってのも困ったもんだよな。
初期のOSXはOOM Killerのような仕組みもなくてシステム全体が固まってたな。
2021/01/05(火) 19:58:11.78ID:dzUtU5Ds0
>>431
1秒後に再度確保?
バカ丸出し
2021/01/05(火) 20:01:22.72ID:8cFKE+AV0
お行儀よく死ぬ機構があるかどうか
2021/01/05(火) 21:50:05.77ID:9HicEvTUd
>>428
話が変わってるぞw
論理的に思考できない根本的にプログラマー向きじゃない人だな
>>429
どんな適切なエラー処理をすればいいのか
ご教示願いたいw
2021/01/05(火) 22:27:33.74ID:K71kt7oj0
>>436
> どんな適切なエラー処理をすればいいのか
ケースバイケース
前提示さずにこんな質問する奴はプログラマーに向いてない
2021/01/05(火) 23:58:57.29ID:zD1ciQHW0
OOM Killer は、Kubernetes のリソース制限の基本。
Linux のnamespace, cgroup

例外は、
アプリ例外は業務上のエラーだから、アプリで処理すべき。
システム障害などは、アプリで処理できる例外ではない
2021/01/06(水) 00:01:25.01ID:WT+BV7/+0
その分類上、メモリ確保失敗はアプリで処理すべきなのかどうかわかんなくない?
2021/01/06(水) 00:46:50.28ID:g4fxgipO0
mallocに失敗したらローカルで確保してみる
それが駄目なら一時ファイル作ってそこに格納する
他にも手はありそうだ
2021/01/06(水) 01:23:26.66ID:8o6ePSWp0
>>440
ねーよ間抜け
2021/01/06(水) 03:55:31.45ID:Sqdcyjlhd
>>437
ケースバイケース言いたいだけだったのかw
>>428
new使うだけでmallocされるのにそんな化石みたいなこと言われても
2021/01/06(水) 05:25:17.33ID:kVhO/tYW0
>>440
> mallocに失敗したらローカルで確保してみる
ローカルが何を意味してるのかわからんがローカル変数のことならはじめからローカル変数で確保しておくべき
2021/01/06(水) 05:28:43.74ID:kVhO/tYW0
>>442
> ケースバイケース言いたいだけだったのかw
言いたいだけって言うかそれ以外に言いようがないだろw
マジで言ってるならプログラマー失格レベル
445デフォルトの名無しさん (アウアウクー MMb1-Unlw)
垢版 |
2021/01/06(水) 07:24:13.29ID:bGGeDo6wM
アプリケーション開発しかやったことないのでシビアな状況のプログラムってのがよくわかってないけど

通常のプログラムだったらNULLが帰ってきたら終了だろうね

失敗が許されない環境で、もしメモリを使い果たして確保できないような状況の場合は失敗が許されないのにメモリを使い果たすようなプログラム自身を改善した方が良いような
ファイルから必要なデータだけを読み込むようにして使い終わったメモリは開放するとか

メモリを使い果たして無いのに失敗する可能性とかだったら、標準関数の正常な役割が信用できないという事になるのでプログラム言語自体使えなくなるよね
C/C++だけじゃなくて
それならアセンブラで直接書くしか無くなるのでは
この場合だったら「たらーれば」の言いがかりにしか聞こえないけど
2021/01/06(水) 09:52:33.41ID:NVCaEro60
そこんところはホスト環境・開発システムがどこまで保証するかという話になるので、
各環境で十分な保証があるなら使えばいいし、保証がないなら使えないというだけのことでは。

私も実態を知ってるわけじゃないが組み込み開発だったら
実際には保証というか自分たちで検証することも多いと思うが。
2021/01/06(水) 15:10:46.82ID:6EEBy3Y5d
Linux系にはヒープの上限を設定できないの?
よくある入門書にはnewで敵キャラでもエフェクトでも作って動かしましょうみたいなのがよくあるが
それやって消すのを忘れると一日動かしてるとかなりの容量になり突然システムが止まる
懐かしいシングルタスクOSの時代と変わらんw
Win16や32だとローカルヒープは上限があって一杯になってもアプリが止まるだけでシステムは続行できた
2021/01/06(水) 15:49:09.66ID:kVhO/tYW0
>>447
> Win16や32だとローカルヒープは上限があって一杯になってもアプリが止まるだけでシステムは続行できた
それはプロセス単位の制限だろ、man ulimit でググってこい
OOM Killerとかはシステム全体の話な
2021/01/06(水) 16:05:04.01ID:QohpZ5Jnd
>>446
Cスレだから組み込み系が話題の中心だと思ってたが
PCのアプリをCで書くなんて人がいまだにいるの?
2021/01/06(水) 17:27:30.00ID:NVCaEro60
>>449
ロジック部分を C で書くことはもうあまりないかもしれんが、
低レイヤや速度チューニングがなくなるわけではないからなぁ。
コードの総量に C が占める割合は少ないにしても
C が (一部には) 使われているものはまだまだあるんじゃね?
2021/01/06(水) 17:33:29.06ID:QohpZ5Jnd
アプリの速度チューンならC++で良いと思うんだが
なぜC?
2021/01/06(水) 18:33:49.31ID:m3At07SYM
>>447
ulimit -d でできるぽいね
2021/01/06(水) 18:53:37.18ID:kVhO/tYW0
>>449
LinuxのカーネルとかApacheとか未だにC言語は残ってるよ
新規は少なくなっていくだろうけどCOBOLと同様にメンテでは当面使い続けられると思うぞ
2021/01/06(水) 19:00:16.49ID:A7AJXFBH0
カーネルがmallocで失敗???
システムごと死ぬだろ
2021/01/06(水) 20:05:41.96ID:6EEBy3Y5d
>>448
だからアホなアプリ一個でシステムが止まるなんて前世紀の話か?と聞いてるんだよね
それともここはシステム関連の話だけか?
mallocの仕組みもしらずにシステムいじろうなんて命知らずの人だねw

>>452
シェルコマンドじゃなくて
このアプリちょっと試してみてよ、と他人に渡した時に行儀よくできるような言語自体のオプションはないものかな
mallopt()が近いみたいだけど英語ドキュメントしかないや
2021/01/06(水) 20:50:30.31ID:kVhO/tYW0
>>455
> だからアホなアプリ一個でシステムが止まるなんて前世紀の話か?と聞いてるんだよね
だから OOM Killer でググってこいよ
システムを止めるかどうかは設定によるし、Windows でもメモリー逼迫したら不安定になるから

> シェルコマンドじゃなくて
https://linuxjm.osdn.jp/html/LDP_man-pages/man2/setrlimit.2.html
そもそもシェルから設定できるのにプログラムから設定できないわけ無いだろ
プログラマーの素養なさ過ぎ
2021/01/06(水) 20:52:54.12ID:3ZsNazx6d
C言語なんだから無条件でPC前提にするのやめようぜ
2021/01/06(水) 20:58:31.92ID:3ZsNazx6d
Windowsでも
プロセスとスレッドのプライオリティを上げて
メモリを大量に使えば
スワップしまくって激重になって
事実上システムが死ぬけどね
2021/01/06(水) 20:59:44.32ID:3ZsNazx6d
アプリ1個でシステムダウンさせるのはそれほど難しくない
2021/01/06(水) 21:09:38.92ID:yUU4KxYw0
>>459
さすがにそれは不可能では?win3.1 ならまだわかるのですが‥‥
2021/01/06(水) 21:12:39.72ID:3ZsNazx6d
プライオリティの高いスレッドをたくさん作って無限ループすれば死ぬ
2021/01/06(水) 21:17:12.89ID:3ZsNazx6d
プライオリティ31のスレッドを論理コア数分作ればマウスカーソルも止まる
2021/01/06(水) 22:06:17.54ID:FKs+KUNY0
間違えてforkしまくるスクリプト実行してしまって何もできなくなった
2021/01/06(水) 22:06:21.76ID:6EEBy3Y5d
いや別に知恵を絞って無理に止める話はしてないじゃんw
うっかりミス程度で止まったらおそろしいなあ気楽にプログラミングもできないなあって話
2021/01/06(水) 22:38:40.29ID:g4fxgipO0
うっかりシステムをフォーマットしてしまうこともあるしな
2021/01/07(木) 00:44:03.16ID:Vx7SD3qO0
うっかりプライオリティの高いスレッドをいっぱい作っちゃった場合の話
■ このスレッドは過去ログ倉庫に格納されています