2015-04-06 36 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

然后你没有做得对,或者你有没有提到的要求,如果你发布完整的代码,我可能能够帮帮我。 –