2015-08-29 6 views
3

Я начал изучать программирование Linux среди C, и я столкнулся следующее:функция C возвращает указатель на структуру

time_t now; 
struct tm *local_time; 

now = time(NULL); 
local_time = localtime(&now); 

Функция localtime, которая является частью е в API Linux, принимает указатель на time_t который это нормально, но почему он возвращает указатель на tm struct?

Вопрос: как управлять структурой tm после ее инициализации?

если localtime распределила-структуру статически она не может гарантировать, что структура не будет перезаписана, так как программа производства и если tm структура распределяется динамически, то программист должен вызвать free структура больше не нужен.

Итак, какова правильная фаза для функции C, которая возвращает указатель?

Спасибо!

ответ

1

Кевин объяснил, в чем проблема, и что ваше предположение верно. Для таких классов функций можно применить простую фиксацию:

time_t now; 
struct tm local_time; 

now = time(NULL); 
local_time = *localtime(&now); 

По возвращении из localtime(&now) содержимое статически выделенной структуры будут скопированы на локальной структуры local_time.

EDIT: Есть много других вещей, чтобы сказать:

  1. У вас еще есть проблемы с помощью функции между потоками ...
  2. Этим же буфером разделяются на множество реализаций, между mktime и gmtime , поэтому их использование также может изменить структуру.
  3. C99 & C11 предлагает более безопасную функцию [TR 24731-1].

    localtime_s(const time_t * restrict timer, struct tm * restrict dst);

5

В соответствии с manpage for localtime (жирным шрифтом и курсивом добавлены для ясности):

LocalTime() функция преобразует временную timep календаря, чтобы разбитой представление времени, выраженное относительно заданного часового пояса пользователя. Функция действует так, как если бы она называлась tzset (3), и устанавливает внешние переменные tzname с информацией о текущем часовом поясе, часовом поясе с разницей между скоординированным универсальным временем (UTC) и локальным стандартным временем в секундах, а дневной свет - ненулевым значением, если дневной свет правила экономии времени применяются в течение некоторой части года. Возвращаемое значение указывает на статически выделенную структуру, которая может быть перезаписана последующими вызовами любой из функций даты и времени.Функция localtime_r() делает то же самое, но сохраняет данные в предоставленной пользователем структуре. Не нужно устанавливать tzname, часовой пояс и дневной свет.

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

Вам либо необходимо немедленно кэшировать полученную структуру, либо использовать функцию, указанную в выделенной части.

Смежные вопросы