-1

独自の sizeof 演算子を実装しているときに、以下に示す 1 つの例に出くわしました。

#define my_sizeof(type) (char *)(&type+1)-(char*)(&type)
int main()
{
    double x;
    printf("%d", my_sizeof(x));
    getchar();
    return 0;
}

#define で (char *) を使用し、他の型キャストを使用しなかった理由がわかりません。記述された構文の正確な意味を知る必要があります。誰かがこれを理解するのを手伝ってくれますか..?

前もって感謝します。

4

2 に答える 2

7

それを理解するには、書くときに知っておく必要があります

double d[2];
double *p = d;
p = p + 1;      p is now pointing to the next double i.e. &d[1] 

メモリ内でバイトが前方pに移動しましたsizeof(double)

p を文字ポインターとして扱うと、代わりにオフセットが変更されたバイト数を取得できます。

double d[2];
double *p = d;
char* start = (char*)p; 
p = p + 1;
char* end = (char*)p;

end-startオフセットをバイト (文字) IOW で与えるようになりましたsizeof(double)

于 2013-04-04T05:18:41.183 に答える
1

Cでは、sizeof char(定義により)1です。char *ポインタを減算して、指されているオブジェクトのサイズを取得できるようにキャストします。

これはほとんどの場合機能しますが、配列にない場合、AFAIUは意地悪に「次のオブジェクトを指す」ことは、常に正しく機能することが保証されているわけではありません。さらに、配列内の必要なパディングを含むオブジェクトのサイズは、必ずしもオブジェクトのサイズではありません。

ブレッチャラス。を使用するだけsizeofです。`

于 2013-04-04T18:19:23.777 に答える