Генерация случайных дат с фиксированным диапазоном - PullRequest
0 голосов
/ 13 февраля 2019

Я написал программу, которая должна проверять, соответствует ли компилятор требованиям POSIX (поэтому моя переменная time_t будет содержать правильные даты), находить текущий год и генерировать несколько случайных дат.Даты должны быть в диапазоне двух лет, последнего и текущего (приблизительно).

К сожалению, блок, определяющий текущий год, вызывает какое-то неопределенное поведение.Вот мой код:

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define N 5
#define ONE_YEAR 31536000
#define TWO_YEARS 63072000
#define TM_AND_POSIX_YEAR_DIFF 70

int main(void) {

  // Start of the block which causes undefined behavior
  struct tm *tm_today = (struct tm *)malloc(sizeof(struct tm));
  short td_year;
  time_t *today = (time_t *)malloc(sizeof(time_t));
  time_t t[N];
  // Checking if compiler meets POSIX requirements
  time_t check = 86400;
  if (strcmp(asctime(gmtime(&check)), "Fri Jan 02 00:00:00 1970\n") != 0)
    return 1;
  // Determining current year
  *today = time(NULL);
  tm_today = gmtime(today);
  td_year = (*tm_today).tm_year - TM_AND_POSIX_YEAR_DIFF;
  free(today);
  free(tm_today);
  // End of the block which causes undefined behavior
  // Generating random dates
  for (unsigned char i = 0; i < N; ++i) {
    t[i] = (time_t)round(((double)rand() / RAND_MAX) * TWO_YEARS) +
           ONE_YEAR * td_year;
    printf("%d\n", t[i]);
    puts(asctime(gmtime(&t[i])));
  }
  return 0;
}

PS Мне нужны структурные переменные time_t и tm (today, tm_today), используемые для определения того, что сегодняшний год является динамическим.

1 Ответ

0 голосов
/ 13 февраля 2019

gmtime() возвращает указатель на внутреннее значение (или нулевой указатель), который нельзя передавать free().И мы теряем указатель на выделенную память.

struct tm *const tm_today = gmtime(today);
if (tm_today) {
    // use it
}
// DO NOT free(tm_today) - it's not ours
...