マシンは、ジェネリック ポインターに割り当てるスペースをどのように知るのでしょうか? 型にキャストするときにのみ割り当てられますか?
4 に答える
「ジェネリックポインター」の意味がわかりませんが、「voidへのポインター」を意味する場合、それは単に他のポインター値を表すことができる型です。これは、任意の大きさでなければならないという意味ではありません。実際、これは「文字へのポインター」と同じサイズと表現であり (定義されている)、任意の型を指すこともできます。
ほとんどのプラットフォームでは、ポインタは一般に、コンパイル対象のシステムのメモリ アーキテクチャに基づいて固定サイズになっています。それに関しては、彼らのタイプは関係ありません。ポイントは、複合体へのint
ポイントと同じサイズstruct
です。であるという事実は、これvoid
を変更しません。
すべてのポインタは、コンパイル時にコンパイラに認識されるサイズです。異なる場合があるのは、指摘されているアイテムのサイズです。必要なサイズをmalloc
/calloc
自身に渡すので、コンパイラは割り当てに問題はありません。
EDIT(コメントに応じて)異なるポインタのサイズが異なる場合があります。たとえば、ハーバード アーキテクチャ用にコンパイルされたコードでは、データ ポインターには、プログラム メモリに格納されているデータとデータ メモリに格納されているデータを区別する追加のストレージが含まれている必要がありますが、関数ポインターにはその追加のストレージは必要ありません。ただし、これはコンパイラーに認識されているため、ポインターの型を調べることで必要な割り当てサイズを認識します。
ポインターは、何を指していてもすべて同じサイズです。異なるサイズになる可能性があるのは、ポインターが指しているものだけです。