1

パラメータを持つ関数 A がありchar *ます。では、 buf のサイズを計算A()するために使用sizeofしましたが、i686 マシンでは 8、armel マシンでは 4 になりました。なぜ128ではないのですか?スニペットは次のとおりです。

void A(char *p)
{
    printf("sizeof p is %d\n", sizeof(p));
}

int main(void)
{
    char buf[128];
    printf("sizeof buf is %d\n", sizeof(buf));
    A(buf);
    return 0;
}

結果は次のようになります(i686の場合):

sizeof buf is 128
sizeof p is 8

私にその理由を教えてください。

4

4 に答える 4

2
  • main()関数ではbuf、 は配列であるためsizeof buf、この配列のサイズsizeof(char[128])(128 バイト) を示します。これは、配列が演算子のオペランドとして使用される場合、ポインターに変換さsizeofれないためです。

  • A()関数ではp、 はポインターであるためsizeof p、このポインターのサイズを示しsizeof(char *)ます (実装では 8 バイト)。

于 2013-07-02T11:14:24.060 に答える
2

sizeof(buf)128*sizeof(buf[0])及び sizeof(p) はジャストsizeof(char*)です。

于 2013-07-02T11:14:35.333 に答える
1

ポインターのサイズではなく、ポインターのサイズを出力するためです。配列はポインターに崩壊し、それを関数に渡すとすぐに、代わりにポインターが得られ、元の配列のすべてのサイズ情報が失われます。

于 2013-07-02T11:14:01.440 に答える