移植性のあるCプログラミング

C言語を使って移植性の高いプログラミングを行うのは簡単ではありません。このブログでは、筆者自身の備忘録を兼ねて、移植性のあるプログラミングのノウハウを記録していきたいと思います。
<< June 2017 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 >>
 
PROFILE
RECOMMEND
Cプログラミング診断室―さらに美しく健康的なプログラムのために
Cプログラミング診断室―さらに美しく健康的なプログラムのために (JUGEMレビュー »)
藤原 博文
私がある程度C言語でプログラミングができるようになった頃、この本の旧版を読みました。
非常に辛口の内容であり、読者によっては嫌悪感を抱く方もおられるかもしれませんが、「Cプログラミング診断室」は、C言語に関する数少ない有益な書籍のひとつです。もっとも、元の内容がかなり古いため、今となってはやや時代遅れとなった部分もあります。しかし、それを差し引いても、十分に読む価値のある一冊です。
RECOMMEND
新ANSI C言語辞典
新ANSI C言語辞典 (JUGEMレビュー »)
平林 雅英
まだC言語を覚えたてだった頃、この本の前の版である「ANSI C言語辞典」がボロボロになるまで活用しました。私が購入したC言語関連の書籍の中では、最もコストパフォーマンスが高かったと思います。
あまりにもボロボロになったので、改訂版にあたる、この「新ANSI C言語辞典」を購入しました。旧版を最初に手にしてから10年以上経ちますが、今なお手放すことができない必携の一冊です。
ARCHIVES
RECENT COMMENT
RECENT TRACKBACK
MOBILE
qrcode

無料ブログ作成サービス JUGEM
 
スポンサーサイト

一定期間更新がないため広告を表示しています


- | | - | -
ポインタ同士の減算
最近話題になったので備忘録代わりに投稿しておきます。ポインタ同士の減算についての話題です。

ポインタというのは、規格上は何らかのオブジェクトしか指すことができませんし、ポインタ同士の減算ができるのは、同じ集成体に属すものだけです。しかし、現実にはそんな制約を杓子定規に守っていると、カーネルやデバイスドライバや低水準のライブラリを実装するのが困難になります。

そこで、任意のアドレスを指すポインタを使ったり、それらの減算を行ったりするわけですが、同じ配列の要素を指すポインタ同士の減算では起きなかった事態に遭遇することがあります。

ポインタ同士の減算結果は、<stddef.h>ヘッダで定義されるptrdiff_t型という符号付き整数型になるわけですが、典型的な32ビットの処理系では、アドレス空間もptrdiff_t型もともに32ビットであり、2Gバイトを超えて離れたchar型のポインタ同士を減算するとオーバーフローが発生してしまいます。

これを回避するためには、いったん符号無し整数型にポインタをキャストしてから減算する必要があります。しかし、ポインタのサイズ以上の符号無し整数型として何を選ぶかも厄介な問題です。C99であれば、<stdint.h>ヘッダで定義されるuintptr_t型を使えばよいのですが、古い規格ではそもそもポインタの値を格納できる汎整数型が存在すること自体保証されません。

untptr_t型の代わりになりそうなものとしてsize_t型がありますが、size_t型はsizeof演算子の結果の型ですので、オブジェクトのサイズ以上は表現できません。したがって、2Gバイトを超えるようなサイズは表現できないことが多々あります。

なかなか難しい問題ですが、この問題を回避するには、処理系をある程度特定して、条件付きコンパイルなどの方法を採るしかなさそうです。

スポンサーサイト

- | 17:27 | - | -
コメント
コメントする









 
トラックバック
この記事のトラックバックURL
http://portable-c.jugem.jp/trackback/19