Сбой программы при использовании struct tm, если time_t не объявлено первым

#c #c

#c #c

Вопрос:

Я пытаюсь предотвратить повторное создание колеса. Я анализирую входной файл, в котором время является одним из значений. Мне нужна структура данных для хранения всех значений входного файла, и вместо создания пользовательской структуры для поля time я хочу просто использовать struct tm из ctime.

Однако я сталкиваюсь со странной ошибкой, так что, надеюсь, кто-нибудь из вас сможет мне помочь. Вот мой тестовый код (для подтверждения концепции):

 #include <ctime>
#include <cstdio>

int main()
{

int Oldhour = 16;
int OldSecond = 25;
int OldMinute = 20;

time_t seconds;

struct tm * timeinfo;

timeinfo->tm_hour = Oldhour;
timeinfo->tm_min = OldMinute;
timeinfo->tm_sec = OldSecond;


int hour, min, sec;

hour = timeinfo->tm_hour;
min = timeinfo->tm_min;
sec = timeinfo->tm_sec;

printf("%d:%d:%d", hour, min, sec);

return 0;
}
  

Это компилируется просто отлично, и это делает именно то, что я хочу, и печатает «16: 20: 25», поэтому он хранит информацию так, как я хочу. Однако, если я удалю строку «time_t seconds;», она немедленно вылетает.

Комментарии:

1. Если есть ответ, который решает вашу проблему, вы должны нажать, чтобы принять его.

2. Я опубликовал сообщение в конце рабочего дня, поэтому я только сейчас возвращаюсь, чтобы проверить ответы.

Ответ №1:

Вам нужно разместить структуру либо в стеке, либо в куче с помощью malloc. В частности, вы объявляете указатель на структуру, не выделяя для нее никакого хранилища.

Попробуйте это:

 #include <ctime>
#include <cstdio>

int main()
{

int Oldhour = 16;
int OldSecond = 25;
int OldMinute = 20;

time_t seconds;

struct tm timeinfo;

timeinfo.tm_hour = Oldhour;
timeinfo.tm_min = OldMinute;
timeinfo.tm_sec = OldSecond;


int hour, min, sec;

hour = timeinfo.tm_hour;
min = timeinfo.tm_min;
sec = timeinfo.tm_sec;

printf("%d:%d:%d", hour, min, sec);

return 0;
}
  

Комментарии:

1. Я знал, что это будет что-то простое. Конечно, это все еще не объясняет, почему это работает, когда сначала объявляется «time_t seconds».