結構甘く見ていた型キャスト…やらかしました。
4時間ぐらい何度も何度もループを回してようやくたどり着きました…。デバッガで追えれば大したことないところですが、そんな環境じゃないんですよね(笑)
色々と見直しつつ怪しいところを潰して、最後に残ったのが型キャストの部分で、正直なところキャストの概念って良く分かってないんですよね(笑)
普通のスカラー型なら注意できるんですけど、ポインタ型の型キャストとかになると何となくは分かるんですが、しっかりとはあまり分かってなかったりします。概念は理解できるんですが、感覚が良く分からない。
で、一番あれなのが、キャストは優先度が高いというのもわかってはいたのですが…結局やらかしたのはこのパターン
(int64_t *) a = (int64_t *) b + 128; … (1)
これbの型はint64_tのポインタ型として128要素先のアドレスになるはず。(すでに間違ってる?w)
でbの型はchar型のポインタとして定義されているとして、意図としてはbの128byte先の要素を指すポインタをaに格納したい場合は、
(int64_t *) a = (int64_t *) (b + 128);
というようにする必要があるわけです。カッコがない(1)のように書いた場合は、先にbがint64_tのポインタ型としてキャストされるので、int64_tの型のサイズ×128=1024byte先のアドレスを指すわけです。
これね…分かるんですよ。理屈はね…でも何だろうなぁ…あまり触れたくない意識が強すぎていつも触らぬ神に祟りなし状態で避けてたりするんですよね(笑)
0 件のコメント:
コメントを投稿