11

私はいつもこのmallocスタイルを使用しています

int *rc = 0;
rc = malloc(sizeof(*rc));

ただし、呼び出したときにそれsizeof(*rc)を想定しrc==0NULLポインタを逆参照している場合でも、セグメンテーション違反は発生しません。

4

4 に答える 4

26

あなたは実際には何も間接参照していません。sizeofVLAでない限り、の引数は評価されません。の引数として必要な「ガベージ」を置くことは、言語によって明示的に許可されていますsizeof。この言語は、式のタイプのコンパイル時分析を実行するだけで、何も評価しないことを保証します。たとえば、式sizeof i++はの値を変更しないことが保証されていますi

その規則の唯一の例外は、可変長配列です。for VLAの結果はsizeof実行時の値です。これは、引数が評価され、有効である必要があることを意味します。

于 2012-11-26T22:42:34.950 に答える
8

演算子は実際にはそのオペランドを評価せず、sizeofその型のみを調べます。のタイプ*rcint、なので、と同等sizeof (int)です。これはすべてコンパイル時に発生します。

(また、これは「mallocの内部」ではありません。)

于 2012-11-26T22:43:22.377 に答える
4

実際にはポインタを逆参照しているのではなく、ポインタの型のサイズをコンパイラに要求していrcます。この場合sizeof、ポインタがないコンパイル時に解決されます。

于 2012-11-26T22:42:48.953 に答える
3

sizeof(type of *rc)これは、ではなく(つまり、sizeof(int))と同等sizeof(data stored at the location pointed to by rc)です。 値ではなく、型sizeof()で機能します。

sizeofは実際のデータを考慮せず、タイプのみを考慮します。したがって、ポインターを区別する必要はありません(そして意味がありません)。

于 2012-11-26T22:42:58.337 に答える