C言語では、struct
へのポインタはvoid *
に変換され、その逆も可能です。また、言語では、定義されていない場合でもstruct
へのポインタを定義することができます。コンパイラはこれらの構造体について何も知らないので、ポインタの物理的表現は同じでなければならないと私は思います。 2つの別々のモジュールにこれらの行を考えてみましょう:構造体とキャストへのポインタ
/* FILE1.c */
void *mem = ...; //Points to a suitable memory block
struct s1 *p1; //No implementation given for struct s1
void *mem2;
p1 = (struct s1 *)mem;
mem2 = &p1;
/* FILE2.c */
extern void *mem2;
struct s2 { /*...fields...*/ };
struct s2 *p2;
p2 = *(struct s2 **)mem2;
は、すべてのプラットフォーム上で動作することができ、このコードは、メモリブロックが(例えばmalloc(sizeof(struct s2))
によって割り当てられた)struct s2
を含むのに十分な大きさであることを提供?
つまり、へのポインタのように、struct s1
構造体へのポインタを含むメモリセルを再解析するのは正しいですか?
(免責事項:私は、これはポインタと遊ぶのが非常に奇妙な方法であることを完全に認識しています、私の質問は、理論的である)
'sizeof(int *)'が 'sizeof(double *)'と異なる場合の例を挙げることができますか? – mikithskegg
歴史的に、ある(非常に古い)Lispマシンは36ビットの単語と "タグ付き"アドレスを持っていました:プレーンアドレスの場合は32ビット、データタイプタグの場合は4ビット。したがって、ポインタにはポインタの型に関する情報が含まれており、キャスト操作は一般的にビットのコピーではありませんでした。私は今日、同様のアーキテクチャを持つCPUがあるかどうかはわかりません。 –
@mikithskegg for 'int *'と 'double *'私は分かりませんが、例えばCray PVPシステムは 'char *'の64ビット表現と 'double *'の32ビット表現を持っています。 – ouah