Почему одни и те же результаты возвращаются двумя разными вызовами в моем коде c? - PullRequest
0 голосов
/ 25 марта 2019

Я скомпилировал его на платформе Debian с помощью GCC (4.9.2).

#include <string.h>
#include <stdio.h>

static const char *msg[] = {"Sunday", "Monday", "Thuesday"};
static char buf[20];

char *getday(int idx) {
    strcpy(buf, msg[idx]);
    return buf;
}

int main(void) {
    printf("%s %s\n", getday(0), getday(1));
    return 0;
}

Выглядит хорошо, но всегда печатает одну и ту же строку ( Воскресенье ). Нопочему?

Ответы [ 2 ]

1 голос
/ 25 марта 2019

getday возвращает адрес buf.Таким образом, printf получает один и тот же параметр дважды (адрес buf).buf содержит строку "Воскресенье" , когда printf оценивает его параметры, потому что сначала выполняется getday(1) (в вашем случае компилятор сначала выбирает самый правый параметр), заполняя bufстрока «Понедельник» , затем getday(0) выполняется, заполняя buf строкой «Воскресенье» , а затем printf использует данные по данному адресу (которыйis "Sunday").

Чтобы исправить это, вы должны либо скопировать возвращаемое значение getday() в отдельные локальные буферы и передать их в printf, либо каждый раз возвращать разные адреса, например, возвращаяадрес в массиве msg вместо buf, например, так:

char *getday(int idx) {
    return msg[idx];
}
1 голос
/ 25 марта 2019
Функции

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

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

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