У меня есть небольшая программа C, в которой пара функций должна печатать текущую дату, но они не всегда это делают:
#include <stdio.h>
#include <time.h>
#include <string.h>
#define BUF_LEN 16
typedef struct {
const char *year;
const char *month;
const char *day;
} date_s;
date_s string_to_date(char *buffer) {
if (buffer) {
const char *year = strtok(buffer, "/");
const char *month = strtok(NULL, "/");
const char *day = strtok(NULL, "/");
printf("INFO 2: YEAR: %s, MONTH: %s, DAY: %s\n", year, month, day);
return (date_s) {.year = year, .month = month, .day = day};
} else {
return (date_s) {.year = "0000", .month = "00", .day = "00"};
}
}
date_s get_current_date(void) {
char buffer[BUF_LEN] = {0};
time_t t = time(NULL);
const struct tm *tm = localtime(&t);
strftime(buffer, BUF_LEN, "%Y/%m/%d", tm);
printf("INFO 1: %s\n", buffer);
return string_to_date(buffer);
}
void print_data1(const char *year, const char *month, const char *day) {
printf("1.) YEAR: %s, MONTH: %s, DAY: %s\n", year, month, day);
}
void print_data2(date_s date) {
printf("2.) YEAR: %s, MONTH: %s, DAY: %s\n",
date.year,
date.month,
date.day);
}
int main(void) {
date_s current_date = get_current_date();
// This prints always the expected values.
//date_s current_date = {.year = "0000", .month = "00", .day = "00"};
printf("INFO 3: YEAR: %s, MONTH: %s, DAY: %s\n",
current_date.year,
current_date.month,
current_date.day);
print_data2(current_date);
print_data1(current_date.year, current_date.month, current_date.day);
return 0;
}
Компиляция, как это делает не показывает ожидаемый результат:
gcc -g -Wall -O0 -std=c99 -o example example.c
gcc -g -Wall -O1 -std=c99 -o example example.c
Он показывает что-то вроде этого:
INFO 1: 2020/07/13
INFO 2: YEAR: 2020, MONTH: 07, DAY: 13
INFO 3: YEAR: 2020, MONTH: 07, DAY: 13
2.) YEAR: �8���, MONTH: , DAY: [����U
1.) YEAR: �8���, MONTH: , DAY: X8���
Компиляция, как это, показывает ожидаемый результат:
gcc -g -Wall -O2 -std=c99 -o example example.c
gcc -g -Wall -O3 -std=c99 -o example example.c
Результат:
INFO 1: 2020/07/13
INFO 2: YEAR: 2020, MONTH: 07, DAY: 13
INFO 3: YEAR: 2020, MONTH: 07, DAY: 13
2.) YEAR: 2020, MONTH: 07, DAY: 13
1.) YEAR: 2020, MONTH: 07, DAY: 13
Вопросы:
- Почему код не показывает текущую дату в первых двух случаях? (-O0 и -O1)
- Почему код работает в последних двух случаях? (-O2 и -O3)
- Что я могу сделать, чтобы он работал всегда? Также независимо от уровня оптимизации g cc.