продвижение аргументов в вызовах функций C - PullRequest
3 голосов
/ 31 мая 2010

Я узнал от ---- Относительно того, когда запускаются продвижения по умолчанию: продвижения аргументов по умолчанию используются именно тогда, когда ожидаемый тип аргумента неизвестен, то есть, когда нет прототипа или когда аргумент является переменным.

Но меня смущает пример:

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;
}

Понятно, что в приведенном выше примере: при вызове func в main нет необходимости продвигать аргументы a и b, но вывод показывает & a = & b +4, а не & a = & b + 1. Если продвижение не произошло, почему 4 байта между двумя аргументами CHAR?

1 Ответ

1 голос
/ 31 мая 2010

Поскольку компилятору хочется делать это так: -)

Вы не можете сделать вывод, что аргумент был или не был продвинут, просто посмотрев на его адрес. Не требуется, чтобы аргументы передавались в стеке случайным образом (или, вообще, даже если они вообще передавались в стек).

Компилятор (и соглашения о вызовах для вашей платформы) может указывать, что стек всегда выровнен на 4 байта, но это деталь, зависящая от реализации, а не часть стандарта языка C.

...