неожиданное поведение функции - PullRequest
0 голосов
/ 28 января 2019

Прежде всего вот код:

//functions
char dernier(char* s){
    return s[strlen(s)-1];
}

char* debut(char* s){
    s[strlen(s)-1] = '\0';
    return s;
}

//problematic bit :
printf("%s %s %c", debut(s), s, dernier(s)); //s = "test"

Я ожидал, что результат будет tes tes s, но я получаю tes tes t, что я нахожу странным.

Любая идея, почему?Спасибо!

1 Ответ

0 голосов
/ 28 января 2019

В стандарте C нет обязательного порядка, в котором должны оцениваться аргументы функций.Это полностью зависит от реализации / ABI.

Если вы используете вездесущий x86-32 с переменной функцией, такой как printf, вы почти наверняка используете соглашение о вызовах cdecl, в котором аргументы выдвигаютсясправа налево.Это означает, что ассемблерный код рядом с сайтом вызовов для printf, скорее всего, будет выглядеть примерно так (псевдо-ассемблерный код):

push @s
call _dernier
push <ret val from _dernier>
push @s
push @s
call _debut
push <ret val from _debut>
push @format_string
call _printf

Обратите внимание, однако, что даже с cdecl соглашением о вызовах вседиктуется порядок, в котором должны быть выдвинуты аргументы.Они по-прежнему могут оцениваться в любом порядке, если они помещаются в стек справа налево;вам нужно посмотреть на сгенерированный код сборки из вашего собственного компилятора, чтобы точно знать.

...