私はいつもこのmallocスタイルを使用しています
int *rc = 0;
rc = malloc(sizeof(*rc));
ただし、呼び出したときにそれsizeof(*rc)
を想定しrc==0
、NULL
ポインタを逆参照している場合でも、セグメンテーション違反は発生しません。
私はいつもこのmallocスタイルを使用しています
int *rc = 0;
rc = malloc(sizeof(*rc));
ただし、呼び出したときにそれsizeof(*rc)
を想定しrc==0
、NULL
ポインタを逆参照している場合でも、セグメンテーション違反は発生しません。
あなたは実際には何も間接参照していません。sizeof
VLAでない限り、の引数は評価されません。の引数として必要な「ガベージ」を置くことは、言語によって明示的に許可されていますsizeof
。この言語は、式のタイプのコンパイル時分析を実行するだけで、何も評価しないことを保証します。たとえば、式sizeof i++
はの値を変更しないことが保証されていますi
。
その規則の唯一の例外は、可変長配列です。for VLAの結果はsizeof
実行時の値です。これは、引数が評価され、有効である必要があることを意味します。
演算子は実際にはそのオペランドを評価せず、sizeof
その型のみを調べます。のタイプ*rc
はint
、なので、と同等sizeof (int)
です。これはすべてコンパイル時に発生します。
(また、これは「mallocの内部」ではありません。)
実際にはポインタを逆参照しているのではなく、ポインタの型のサイズをコンパイラに要求していrc
ます。この場合sizeof
、ポインタがないコンパイル時に解決されます。
sizeof(type of *rc)
これは、ではなく(つまり、sizeof(int)
)と同等sizeof(data stored at the location pointed to by rc)
です。 値ではなく、型sizeof()
で機能します。
sizeofは実際のデータを考慮せず、タイプのみを考慮します。したがって、ポインターを区別する必要はありません(そして意味がありません)。