2015-02-15 2 views
0

В следующей программеГде память переменного, возвращенная функция библиотеки выделяется

int main(){ 
char * time; 
struct tm timeptr; 
t.tm_sec = 10; 
t.tm_min = 10; 
t.tm_hour = 6; 
t.tm_mday = 25; 
t.tm_mon = 2; 
t.tm_year = 89; 
t.tm_wday = 6; 
time = asctime(&timeptr); 
puts(time); 
} 

В случае, если память строки, возвращаемый asctime) выделяется (? Я имею в виду, что он выделяется в стек кучи или вызывающего/вызванного функционала или где-то еще? если его в кучу мне нужно освободить? если его в стеке asctime, как он доступен мне, даже если функция вернула мне контроль? если в стеке вызывающей функции он не повредил данные стека вызывающих? Все, что я понял, это нужно выделить в пространстве пользователя.

+3

Какая ссылка на 'asctime' не упоминает об этом? – Cubbi

+1

В разделе Возвращаемое значение [документация 'asctime()'] (http://en.cppreference.com/w/c/chrono/asctime) вы, скорее всего, найдете свой ответ. – WhozCraig

+0

@WhozCraig нашел ответ –

ответ

0

Возвращаемое значение рассчитывается из статической области; это не куча. , следовательно, последующие вызовы asctime будут изменять строку, указанную ранее возвращенным указателем. Не нужно освобождать возвращенный указатель.

+0

означает, что память будет освобождена только тогда, когда программа умирает или убивается –

+1

Да, статическая память свободна, когда программа умирает или убивается –

0

В документации asctime на cppreference говорит:

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

0

asctime возвращает указатель на строку.

Есть два возможных вопроса, которые можно задать.

  1. Где указатель выделяется?
  2. Где находится выделенная строка?

Ответы:

  1. Где писатель компилятор решает передать его (обычно в регистре, но для более крупных видов возвратных это может быть в стеке).
  2. Где автор функции решает выделить ее. Он мог бы быть либо статическим массивом, либо массивом, выделенным кучей. Чтобы узнать, вам нужно прочитать функциональную документацию. Для asctime это статический атрибут. Для других функций это может быть что-то другое.
Смежные вопросы