3

私は----から学びましたデフォルトの昇格がいつ始まるかについて: デフォルトの引数の昇格は、引数の予想される型が不明な場合、つまり、プロトタイプがない場合、または引数が可変長である場合に正確に使用されます。

しかし、私を混乱させる例は次のとおりです。

void func(char a, char b)
{
    printf("a=%p,b=%p\n",&a,&b);    
}

int main(void)
{
    char a=0x11,b=0x22;

    func(a,b);

    return 0;
}

上記の例ではクリアされています: main で func を呼び出す場合、引数 a と b をプロモートする必要はありませんが、出力は &a = &b+1 ではなく &a = &b +4 を示します。昇格が行われなかった場合、2 つの CHAR 引数の間に 4 バイトあるのはなぜですか?

4

1 に答える 1

2

コンパイラはそのようにそれをするように感じるので:-)

アドレスを見ただけでは、引数がプロモートされているか、プロモートされていないかを推測することはできません。引数がスタック上で継続的に渡される必要はありません (さらに言えば、スタック上で渡される必要さえありません)。

コンパイラ (およびプラットフォームの呼び出し規則) は、スタックが常に 4 バイト アラインされていることを指定する場合がありますが、これは実装固有の詳細であり、C 言語標準の一部ではありません。

于 2010-05-31T12:04:13.893 に答える