2015-04-06 4 views
0

У меня есть эта простая функция:Проблем при создании функции get_time() в C

char* 
get_time() 
{ 
    char *buffer = malloc(sizeof(char)*10); /* HOW TO FREE IT ? */ 
    time_t rawtime; 
    struct tm * timeinfo; 

    time(&rawtime); 
    timeinfo = localtime(&rawtime); 
    strftime(buffer,10,"%H:%M:%S",timeinfo); 

    return buffer; 
} 

вопрос с strftime() который требует char* и я не могу free(buffer); перед возвращением его содержания. Что я мог сделать?

Макрос, где я использую функцию:

#define log_info(msg) printf("%s [INFO ] - %s\n",get_time(), (msg)) 
+1

поддавки буфер в качестве аргумента get_time и использовать статический буфер в вызывающем –

+1

Это природа C: если функция должна возвращать строку , вы должны заставить вызывающего абонента выделить место для него и передать в буфер. Другой вариант, который может работать здесь, - это вернуть структуру фиксированного размера. –

+1

или дайте понять, что вызывающий должен освободить буфер, это тоже слишком часто. – pm100

ответ

0

Что-то вроде этого

static char g_buffer[10];              

#define log_info(msg)        \       
    do {           \       
    get_time();          \       
    printf("%s [INFO ] - %s\n", g_buffer, (msg)); \       
    g_buffer[0] = '\0';        \       
    } while (0)                 

static int get_time()               
{                    
    time_t rawtime;                
    struct tm * timeinfo;              

    time(&rawtime);                
    timeinfo = localtime(&rawtime);            
    strftime(g_buffer,sizeof(g_buffer),"%H:%M:%S",timeinfo);     

    return 0;                 
}                    

int main(void) {                
    log_info("test");               
    return 0;                 
} 

Но так и не получают потребность в макро, функция будет выполнять работу

+0

Вы правы. Мне не нужен макрос, лучше функция. – anat0lius

0

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

struct mytime { 
    char buf[12]; 
} 

struct mytime get_time() { 
    struct mytime r; 
    . . . 
    strftime(r.buf, 10, "%H:%M:%S", timeinfo); 
    return r; 
} 
+0

Не работает для меня :(Я добавил макрос, где мне нужна функция. – anat0lius

+0

Тогда вы не сделали это правильно, или у вас есть требования, которые вы не указали. Если вы разместите полный код, я, возможно, Помогите. –