私はいつもこの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ポインタを逆参照している場合でも、セグメンテーション違反は発生しません。
あなたは実際には何も間接参照していません。sizeofVLAでない限り、の引数は評価されません。の引数として必要な「ガベージ」を置くことは、言語によって明示的に許可されています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は実際のデータを考慮せず、タイプのみを考慮します。したがって、ポインターを区別する必要はありません(そして意味がありません)。