2012-10-24 11 views
7

char *を使用してメモリアクセスを行うクロスプラットフォームコードを記述する際に落とし穴がありますか?クロスプラットフォームコードを書くときにvoid *の代わりにchar *を使う落とし穴はありますか?

UPDATE:たとえば、アドレスがその型のサイズに揃えられている場合、逆参照されたchar *を特定の型(intなど)にキャストする前にチェックする必要がありますか?特定のアーキテクチャでは、アラインされていないアクセスで奇妙な結果が返されますか?

私は、memmoryの問題をデバッグする方法を理解するために、プレイメモリアロケータに取り組んでいます。私はchar *の方がポインタの算術演算を行う能力があり、void *の上でそれらを参照解除する能力があるので望ましいと信じるようになった、それは本当ですか?次の前提は、共通のプラットフォームでは常に同じですか?

sizeof(char) == 1 
sizeof(char*) == sizeof(void*) 
sizeof(char*) == sizeof(size_t) 
+0

'char'インスタンスを逆参照しているのでない限り、' char * 'と' void * 'の両方を指すタイプにキャストする必要があります。 – Aesthete

+0

「保証」されているかどうかわかりませんが、私の経験では最初の2つは安全でなければなりません。最後のもの...? – vdbuilder

答えて

5

sizeof(char)==1は間違いなく常にtrueです。

sizeof(char *) == sizeof(void *)は、であり、おそらくも常に真である。 C標準は、同じ表現を持っていることを要求しています。少なくとも同じ大きさを強く示唆しています。

sizeof(char *) == sizeof(size_t)私はそれが間違っている実装を知っています(おそらく標準に完全には適合しませんが、これは問題の1つではありません)。

+1

Jerryに感謝します。ポインタのサイズと同じサイズの型を知っていますか?たとえば、32ビットビルドでは32ビット、64ビットビルドでは64ビットでなければなりません。私はそのようなタイプだったという印象を受けていた。 – UberMongoose

+1

@UberMongoose:まず、ポインタがすべて同じサイズであるという要件さえありません。彼らは通常そうですが、必須ではありません。ほとんどの典型的なケースでは、 'size_t'も同様ですが、保証されません(少なくとも2つの例外があります)。 MS(一例として)は、INT_PTR(ポインタと同じサイズの整数)のようないくつかの型を定義していますが、これは普遍的なものとは限りません。おそらくあなたができる最良のことは、設定ヘッダーでtypedefを使うことなので、必要なところにプラットフォームがあれば修正することができます。 –

+2

intptr_t? "以下の型は、voidへの有効なポインタをこの型に変換してからvoidへのポインタに変換し、その結果を元のポインタと比較するというプロパティを持つ符号付き整数型を指定します。" – rici

関連する問題