- 1 名前:デフォルトの名無しさん [2007/02/01(木) 23:08:46 ]
- このスレは標準Cのみの限定スレです。
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。 質問する前には最低限検索を。 エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。 C FAQ 日本語訳 www.kouno.jp/home/c_faq/ Cプログラマ必読 ・プログラミング言語C(通称 K&R) www.amazon.co.jp/exec/obidos/ASIN/4320026926/250-7563469-9920244 他の過去ログはここに nssearch.hp.infoseek.co.jp/clang/ 前スレ 【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130 pc10.2ch.net/test/read.cgi/tech/1159613789/ GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は 専門の別スレッド↓があるのでそこへさようなら。 【初心者歓迎】C/C++室 Ver.34【環境依存OK】 pc10.2ch.net/test/read.cgi/tech/1169039760/ C/C++の宿題を片付けます 82代目 pc10.2ch.net/test/read.cgi/tech/1169575464/
- 296 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 00:19:35 ]
- >よって不動小数点数は0.0に、ポインタはヌルポインタに正しく初期化される。
大間違い。
- 297 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 00:39:01 ]
- >>296
俺は294じゃないけど間違いというならその理由を示してよ。 K&R A8.7初期化 より引用 > 明示的に初期化されない静的オブジェクトは、それ(あるいはそのメンバー)に定数 > 0が代入されたかのように初期化される。明示的に初期化されない自動オブジェク > トの初期値は、不定である。
- 298 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 00:52:49 ]
- >>297
根拠を示さず「大間違い」とだけ言うのは小学生だってできる。 無視してかまわんだろう。
- 299 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 00:53:35 ]
- >>297
知らんがたぶん、>>282 じゃないのかな
- 300 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 00:59:15 ]
- >>299
違う。
- 301 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 01:00:15 ]
- >>299
>>297が示している通り、プログラマーが =0 と書いたのと同じように初期化される。
- 302 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 01:01:03 ]
- >>299
関係ないでしょ。だって void *p = 0; と書いてあるように初期化されるんでしょ。 これはpには全ビットが0の値が入るのではなくて、 NULLポインタが入るんだよ。
- 303 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 01:01:37 ]
- 段階を追って詳しい説明になっていくのにワラタw
- 304 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 01:02:24 ]
- ゼロフィルで済む処理系ならBSSをロードする時に全部ゼロ埋めするだけだが、
それで済まない処理系で規格を満たすためには、初期化専用のコードを コンパイラが吐き出して、スタートアップルーチンで呼ばれるようにする んだろね。 なんかC++みたいだなw
- 305 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 01:06:45 ]
- 不動じゃなくて浮動だろと言うつっこみだったんだよ!たぶん
- 306 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 01:07:23 ]
- >>302
それ実は俺もずっと気になってたんだけど ポインタに0代入したらそれはNULLポインタと等価なの? というか全ビット0がNULLとは限らない処理系ってあるの?
- 307 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 01:09:10 ]
- >306
CFAQには、そういう処理系も実在すると書いてあったよ
- 308 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 01:11:14 ]
- というか
ヌルポインタの内部表現が未既定なのも ポインタがくるべき場所に整数定数0を書いたらヌルポインタに変換されるのも 規格がそう定めているからであって、そのような処理系が実在するからではない
- 309 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 01:15:45 ]
- >>306
> ポインタに0代入したらそれはNULLポインタと等価なの? Yes. ポインタの文脈では0はいつでもnull pointer constantとして扱われる。
- 310 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 01:16:21 ]
- ポインタに「値が0の整数定数式」を代入したり、(暗黙にでも)比較したりしたときは、
コンパイラが整数定数0を正しいヌルポインタの値に変換する。 値が0である整数変数を代入する場合はこれにあてはまらない。 あくまで定数だけである。
- 311 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 01:25:21 ]
- >>305
なっとく。
- 312 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 01:27:00 ]
- >>280が変数宣言を書けば、こんなにモメなかったろうにw
ぶっちゃけauto変数以外はリンカーがプログラムに引っ付けて実行形式で出力する。 実行するとローダーがフォーマットに従い元通りに展開してくれる auto変数で使うスタック領域もローダーがフォーマットに従いサイズ分用意してくれるが、 0クリアする決まりが無いので未初期化として扱うのが決まりになってる。 ROMで実行されるプログラムでない限りは、こんな覚え方でいいような気がする。
- 313 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 01:29:48 ]
- NULLの定義が
#define NULL 0 #define NULL ((void*)0) 以外の処理系って見たことある? 俺は無いけど。
- 314 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 01:32:02 ]
- >>312
BSS(未初期化のstatic変数を格納する領域)も実行形式に 埋め込む処理系は少ないのでは。 スペースの無駄だからね。
- 315 名前:306 mailto:sage [2007/03/15(木) 01:37:05 ]
- 物凄い参考になった。皆thx
- 316 名前:313 mailto:sage [2007/03/15(木) 01:39:15 ]
- ちなみに俺はC++の癖でCでもNULLと書かずに0と書いてしまう。
- 317 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 02:15:30 ]
- >>313
最近のgccとかは __null とかになってなかった?
- 318 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 03:16:08 ]
- そうだと困るハードがあるからNULLが0x00000000とは定めてないわけだよねぇ?
- 319 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 03:17:01 ]
- >>316
構わないと思う。
- 320 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 03:27:38 ]
- >>318
ハードにかかわらず、NULLを整数値として評価した場合は 0 として評価されるって規格で定められてたと思うけど。
- 321 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 03:43:29 ]
- >>320
あ、いやNULLの番地がって意味で
- 322 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 05:00:16 ]
- NULLを使わず0で初期化してる人がいるようだけど
俺したこと無い。 例えば int *foo = 0; とか typedef struct{ int a; char *p; }hoge; hoge *ho = 0; とかしちゃったりするの?
- 323 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 05:01:38 ]
- >>322 もちろん。
- 324 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 05:06:01 ]
- 標準ライブラリに含まれてる型名って、ファイルスコープの名前だから
関数ローカルや構造体メンバでその名前使っても問題ないよね? jmp_buf とか va_list とか、マイナーなやつをうっかり使ってしまうことが 無いとは言えないんで、エディタのキーワードハイライトに全部 突っ込んでおこうかと思ったんだけど、よくよく考えたら ファイルスコープでやらかさなけりゃ全然問題ないんじゃないかと。
- 325 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 08:35:49 ]
- >>313
DOSでラージメモリモデルの環境では0Lになっていると思う。 少なくともLSI C-86のヘッダではそうだった。
- 326 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 08:38:48 ]
- >>324
いや、それらはグローバルなので問題ありまくり。 衝突を避けたければ、ユーザコードの名前に特定のPrefixを付けるといった 規約を考えたほうがよい。
- 327 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 09:54:39 ]
- >>326
jmp_buf なんて何の規則も無い名前との衝突を避けようと思ったら、 関数ローカルや構造体メンバに int a; とすら書けないと思うんだが、 正気か?
- 328 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 10:22:35 ]
- >>327
は? 構造体タグ名、変数名、メンバー名は別の名前空間に属するから、 そのような例で同一の名前を用いても問題が生じるわけがないよ。
- 329 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 10:22:58 ]
- >321
単に「NULL」という言葉を「ヌルポインタ」という意味で使うと誤解を招きかねないのでやめたほうがいい マクロNULLとヌルポインタは別のものであるから、区別できるように書くべき
- 330 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 10:27:24 ]
- >>328
元の質問 >324 がそう言って「問題ないよね?」って聞いたのに対して >326 が「問題ありまくり」と返しているんだが。
- 331 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 10:30:11 ]
- >>330
同一の名前空間で同じ名前を重複させたら当然問題あるでしょ。 あなたがC言語の仕様に対する無知によって、的外れな例を挙げただけ。
- 332 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 10:40:58 ]
- >>331
構造体メンバは問題が生じるわけないってことか? なら残りはローカル変数ってことでいいかい? ファイルスコープの typedef である jmp_buf の名前空間は ローカル変数といっしょで変数名だよね? でもローカル変数ならスコープが重なるだけなんで、ライブラリの jmp_buf を使うつもりじゃなくてうっかり(知らずに)ローカル変数名として 使っただけなら問題ないんじゃないの? どうせ内側で宣言されたローカル変数しか参照しないんだから。
- 333 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 10:43:47 ]
- >>332
ヒント: 他人にものを聞く態度 >>336を読まなかったのかい? jmp_bufは「ファイルスコープ」の名前ではありません。
- 334 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 10:52:50 ]
- typedef名と変数名の名前空間も別物です。
だから、 typedef int i; i i; のようなコードも合法。良いスタイルではないけどね。
- 335 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 11:11:43 ]
- >>333
「ファイルスコープ」じゃなくて「グローバルスコープ」って言いたいの? ISO C99 の最新ドラフトを見てしゃべってるんだが、規格には 「グローバル」なんてスコープは無いよ。 6.2.1 で列挙されてるのは "file scope", "block scope", "function prototype scope" の3種類だけ。 "global scope" で 検索してもひとつもヒットしない。なので >326 の言ってる 「グローバル」ってのはファイルスコープのことだと思った。
- 336 名前:333 mailto:sage [2007/03/15(木) 11:14:40 ]
- >>335
あーごめん。嘘ついたかも。 リンケージまで考えるとファイルスコープって一般にstaticなオブジェクトのこと を指すと思うんだけど、今は名前の話だったな。ごっちゃになってたわ。
- 337 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 11:16:45 ]
- 「C99 の最新ドラフト」はおかしいな。
>>334 で、同じく ISO C の最新ドラフトから、 6.2.3 に列挙されてる 名前空間は、ラベル名、タグ名、メンバ名、その他の4つ。 変数名も typedef 名も最後のその他で同じ名前空間です。 どんなコンパイラがそのコードを受け付けてくれるの? 手元の gcc ではやっぱりエラーになるよ。 :2: error: 'i' redeclared as different kind of symbol :1: error: previous declaration of 'i' was here
- 338 名前:334 mailto:sage [2007/03/15(木) 11:20:54 ]
- あー名前空間同じだけど、typedef定義と変数宣言を
スコープ違う形で試したから受け入れられたっぽいな。 こっちもすまん。
- 339 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 11:22:19 ]
- >>329
確かに。お粗末でした。
- 340 名前:324 mailto:sage [2007/03/15(木) 11:57:28 ]
- えーと。つまり >324 はやっぱり問題ないってことでおk?
- 341 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 00:03:57 ]
- >>337
struct a { int a; }; typedef struct a a; a b: void c() { b.a = 0; goto a; a: ; } ってこと?
- 342 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 01:52:18 ]
- >>341
何がしたいのかわからん。
- 343 名前:341 mailto:sage [2007/03/23(金) 09:26:10 ]
- 処理自体には意味ない。
ただ名前空間の分類としては、こういうことかな?と aは全部違う名前空間ということで。
- 344 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 10:34:48 ]
- >>343
そうだよ。ちゃんとコンパイルできただろ?
- 345 名前:デフォルトの名無しさん [2007/03/30(金) 01:20:19 ]
- ↓のようなことって技術的に可能ですか?
何分↓スレに専門知識を持った人間がおらず、真偽が分からなかったので ここで質問させていただきました 558 名前: 麒麟です ◆qJFjoQ6aTk 投稿日: 2007/03/29(木) 22:06:29 ID:ENSP49sq そうだ 一応書いておくわ CとかJavaとか言語でわけてる現状がそもそもおかしいから ソースコード翻訳機作ってやってるよ おまえも参加しろwww 役に立たない下っ端を使えるようにする秘策だぞwwww 561 名前: 麒麟です ◆qJFjoQ6aTk 投稿日: 2007/03/29(木) 22:12:11 ID:ENSP49sq 意味分からないのか?? コンパイラじゃなく ソースコードをそれぞれに変換するってことだぞ 意味分からないかな?? 564 名前: 麒麟です ◆qJFjoQ6aTk 投稿日: 2007/03/29(木) 22:14:33 ID:ENSP49sq たとえば Cで書いたコード100万行を 自動変換で Javaコードに変換するって奴だwwwwww 分かるかな??? ttp://human6.2ch.net/test/read.cgi/dame/1174933496/l50
- 346 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 01:27:44 ]
- >>345
マルチ氏ね!
- 347 名前:デフォルトの名無しさん mailto:sage [2007/03/30(金) 02:31:56 ]
- はいはいわろすわろす
- 348 名前:デフォルトの名無しさん [2007/04/09(月) 14:46:42 ]
- ファイルの作成された日時をゲットする方法を教えてくれい!
- 349 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 14:50:36 ]
- アイコンを右クリックしてプロパティを見る。
- 350 名前:デフォルトの名無しさん [2007/04/09(月) 14:56:45 ]
- >349
そんなアホナ。。。
- 351 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 15:00:27 ]
- ワロタ
stat とか fstat で
- 352 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 15:11:31 ]
- 環境依存
- 353 名前:デフォルトの名無しさん [2007/04/10(火) 12:13:30 ]
- program.exe arg1 arg2 arg3 ....
と何個でも、何文字でも無制限にいけるのか?
- 354 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 12:27:41 ]
- 引数の長さには通常制限があるが、環境依存。
ARG_MAXでぐぐれ。
- 355 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 12:39:20 ]
- 制限はあるけどそれはプログラムの方の制限じゃないよ
- 356 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 20:30:12 ]
- ARG_MAXはPOSIXだと思う
- 357 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 00:27:46 ]
- うん
- 358 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 00:30:27 ]
- シェルの制限かと思ってた
- 359 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 22:37:03 ]
- >>349
できました! ありがとうございます!
- 360 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 01:54:24 ]
- >359
mjky
- 361 名前:デフォルトの名無しさん [2007/04/13(金) 15:40:58 ]
- malloc とか free に一枚皮を被せるって常識なの?
void Free(void *ptr) { if (ptr != NULL) free(ptr); } こんなようなの、、、
- 362 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 15:50:03 ]
- 少なくとも、free() にNULL渡すのは問題ない仕様だから
それは意味無いな。
- 363 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 15:50:40 ]
- 違った delete に渡すのが問題無いんだった
- 364 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 15:51:15 ]
- >>361
常識ではないし、標準Cなら | free 関数は、ptr が指す領域を開放し、その後の割付けに使用できるようにする。 | ptr が空ポインタの場合、何もしない。 ので、まったくの無駄。 もっとも、malloc/free のトレースをしたいという目的で ラップするのはアリ。
- 365 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 16:46:05 ]
- メモリリーク検出には役立つかも知れない
- 366 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 23:45:45 ]
- >>361
ペアであるmalloc/freeのインターフェイスをよりペアらしくできるから、 オレはこんな感じにすることがある。 result_type my_malloc(void **ptr, int size) { *ptr = malloc(size); return (NULL != *ptr) ? result_success: result_faild; } result_type my_free(void **ptr) { if (NULL == *ptr) { free(*ptr); *ptr = NULL; } return result_success; }
- 367 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 00:02:53 ]
- void**はないだろ、常識的に考えて…
- 368 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 00:04:43 ]
- スレタイを100回音読すべきだな
- 369 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 00:25:26 ]
- >>367
間違えやすいよな.C++なら参照使えばいいけど, Cならマクロ使った方がいい局面かも.
- 370 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 00:42:17 ]
- 自分用ツールだったら、よくmallocが0を返したら即exit(1)するラッパを使う。
C++を使えるときにはnewを使えばいいんだけど。
- 371 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 02:43:50 ]
- >>366
my_freeは、渡されてきたポインタがNULLの時にのみ解放してるけど、それでいいの? というか単純ミスだよなw
- 372 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 02:57:19 ]
- my_free(NULL);
- 373 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 09:31:55 ]
- linuxの場合は、malloc()が成功したかどうかは、実際にメモリにアクセスするまで分からないから、
malloc()の戻り値をチェックするのは無駄だって説もあるな。
- 374 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 09:45:08 ]
- >>373
カーネルの設定換えれば検出できるようになるね。 さもなくば、calloc()で検出できるんじゃないか?
- 375 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 10:05:41 ]
- そんな環境依存の話を書かれても
- 376 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 10:12:33 ]
- つまり、このスレ的にはmalloc()の戻り値を検出するためだけのラッパは要らないということで。
- 377 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 10:23:45 ]
- 仕様的にはmallocの時点で割り当て失敗かどうか検出できないのってどうなの?
- 378 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 10:31:26 ]
- WindowsもたぶんVirtualAlloc使うと、実際にアクセスするまで確保されない
ってこのスレじゃ関係ないね
- 379 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 11:49:59 ]
- 今ググても見つからなかったけど、俺が読んだ文章だと「近代的なOSだと、そういうふうになってる」みたいな言い方だったね。
mallic()で0を返さないって。
- 380 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 11:54:59 ]
- マリックwwwww
- 381 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 15:47:16 ]
- >>373
malloc()は、システムコールじゃないよ。libcの関数だよ。 わかってる?
- 382 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 15:58:38 ]
- >>377
駄目。 malloc()の実装のサンプル(システムコールとの関係)はK&Rにも載ってるから 興味がある人は目を通して理解しておくと良いよ。 知ったかぶりすると恥ずかしいから。 Windowsで言うなら、 VirtualAllocは確保できなくても0以外を返すかもしれない(実際は知らない)けど HeapAlloc(OSからもらったメモリを必要な分だけに区切って渡す)は 確保出来ないときは0(NULL)を返すということ。 (サイズ情報等を埋め込むから、必ず実際のメモリにアクセスする) VC++なんかのmallocは、HeapAllocをそのまま呼んでるだけだし。
- 383 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 16:11:45 ]
- www.linux.or.jp/JM/html/LDP_man-pages/man3/malloc.3.html
> デフォルトでは、Linux は楽観的メモリ配置戦略を用いている。つまり、 malloc() が > NULL でない値を返しても、そのメモリが実際に利用可能であることが保証されない。 > これは本当にまずいバグである。 なるほど、確かにこれはバグだと言っている
- 384 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 16:19:02 ]
- ヒント: 管理情報はアプリケーションに返すメモリブロックに隣接している必要はない
malloc()がどう実装されてるかなんてそれこそ環境依存以外の何者でもない とはいえ利用可能でないのにNULLを返さないのは規格違反だろうな
- 385 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 16:23:15 ]
- なるほど、
アドレス空間が足りない時等「一般的にmallocがNULLを返す状況」では無く、 システム全体(カーネルと各プロセス最小限使用分)の「物理メモリ」が不足する状況で プロセスの存在そのものが抹消されるわけね。 それも、自分自身とは限らないプロセスが。
- 386 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 16:25:23 ]
- とはいえ、どう考えても、これが「近代的なOS」と関係あるとは思えない。
「近代的なOS」が使っているのは、仮想記憶とデマンドページングだろ。 mallocが失敗してもNULLを返さないのとは関係ない。
- 387 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 16:26:27 ]
- つまり、このスレ的にはLinuxのlibc(におけるmalloc()の実装)は間違いだということですね。
- 388 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 16:30:32 ]
- Linuxはカーネルだけだから理論的にはまともな実装をしたlibcに置き換えることもできる。
glibcと言っておこう
- 389 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 16:31:52 ]
- >>384
でも、とりあえず、manでヒープの破壊について触れているくらいだから 今話題のLinuxのglibcの実装に関しては、 確保したブロックの前後に管理ブロックがあると、仮定しても構わないでしょ。
- 390 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 16:33:25 ]
- じゃあどういう状況でNULLを返さないことがあり得るんだろう。
アプリケーションに返すメモリがたまたまページ境界にまたがったときかな
- 391 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 16:38:02 ]
- >>390
いや、>>385な状況で、実際に物理メモリが足りないと判明する時でしょ。たぶん。 ページ境界の可能性もあるけど、大きなブロックを確保して真ん中にアクセスした時とかも。 ていうか、この場合、メモリ不足が 「アクセスするまでわからない」じゃなくて「絶対にわからない」だな。 分かった瞬間に検出することも出来ないまま殺されちゃうんだから。 >>373の「NULLチェックが無駄かも」という結論は一緒かもしれないけど。
- 392 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 16:38:04 ]
- あとページサイズを超える大きなメモリブロックを割り当てた場合
最初のページだけは管理情報の書き込み時点でコミットされるけど 2ページ目以降を踏んだとたん落とされる可能性がある
- 393 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 16:38:28 ]
- 2秒差でかぶったorz
- 394 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 21:09:29 ]
- ハードウェアの制限で256の倍数でデータを書き出しを行いたいのですが
端数が出た場合の処理はどのように実現するのがスマートなのでしょうか。 データは必ずシーケンシャルに確実に書き込まれる必要があって困っています。 携帯開発辛い...
- 395 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 21:14:10 ]
- >>394
言語と何ら関係がない質問なので、スレ違い。 まぁ、切り捨てていいなら切り捨てるし切り捨ててはいけないなら補うだけだな。 尤も、補う方法もダミーを詰めるだけでいいのか適当に間引く必要があるのか知らんが。
- 396 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 02:13:31 ]
- >>394
許されるバッファサイズと 書き込みサイズ > 256 書き込みサイズ ~= 256 書き込みサイズ <<< 256 で, 解が 異なると思うんだが...
|

|