0

次のコードは...

void foo(char* x)
{
        int i;
        int len = sizeof(x)/sizeof(x[0]);

        printf("len: %d\n", len);
        for(i=0; i<len; i++){
                printf("i: %d, v: %x\n", i, x[i]);
        }
}

...次のように呼び出される場合:

        char bar[] = {0xDE, 0xAD, 0xBE, 0xEF};
        foo(bar);

...出力:

len: 8
i: 0, v: ffffffde
i: 1, v: ffffffad
i: 2, v: ffffffbe
i: 3, v: ffffffef
i: 4, v: ffffffff
i: 5, v: 7f
i: 6, v: 0
i: 7, v: 0

これに当てはまるかどうかは正確にはわかりませんが、SO に関する同様の投稿を読んでみると、配置の問題のようです (私は 64 ビット マシンを使用しています)。

ポインタはありますか?

ありがとう。

4

1 に答える 1

4

これはアライメントとは関係ありません。

int len = sizeof(x)/sizeof(x[0]);

x配列ではなくポインタです。sizeof (x)64 ビット マシンでは 8 バイトであるポインターのサイズを計算します。

整数の昇格 (符号拡張が実行される)ffffffdeのために insteas を出力するようになりました。deこれを避けるには、代わりに type をffffff使用するか、引数を次のようにキャストします。unsigned charcharprintfunsigned int

printf("i: %d, v: %x\n", i, (unsigned int) x[i]);
于 2012-06-26T10:12:21.613 に答える