Статический символьный массив, возвращаемый из функции Предоставляет неверный ответ - PullRequest
0 голосов
/ 24 декабря 2018

в соответствии с этим кодом:

int main(){
    int x=1;
    int y=2;
    printf(" %s + %s = %s ", function(x) , function(y), function(x+y));
}

char* function(int num){
    static char B[20];
    sprintf(B,"%d",num);
    return B;
}

Ответ, который я получил: 1 + 1 = 1

и вопрос почему?

Почему, если я отделяютакие строки:

int main(){
    int x=1;
    int y=2;
    printf("%s +" function(x));
    printf(" %s =" function(y));
    printf(" %s"function(x+y));
}

Я получил правильный ответ, как и ожидал ???

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Функция function всегда возвращает одно и то же значение, а именно указатель, указывающий на начало статического массива B.

В первом фрагменте кода вы вызываете funtion три раза как частьзвонка на printf.При вызове функции каждый из ее параметров должен быть оценен перед вызовом функции.Это означает, что function вызывается 3 раза до вызова printf, поэтому B содержит только самое последнее сохраненное значение.Это означает, что вы печатаете одну и ту же вещь 3 раза.

Кроме того, порядок, в котором оцениваются аргументы функции, не определен, поэтому вы не знаете, какой вызов function будет последним.Значение, напечатанное три раза, может быть равно 1, 2 или 3.

Во втором фрагменте, поскольку вы вызываете function только один раз при каждом вызове printf, нет никакой двусмысленности относительно того, что будет напечатано.

0 голосов
/ 24 декабря 2018

Поскольку существует только один буфер B, он перезаписывается при каждом вызове функции.Поскольку ваш printf вызов в main вызывает функцию 3 раза, sprintf находит один и тот же буфер все три раза.И нет никакой гарантии относительно порядка, в котором ваша функция будет вызываться при оценке аргументов функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...