2014-03-18 94 views
1

我需要一些帮助与我的C函数。我试图获取当前的CPU时间并将其作为char []返回以供以后使用。我得到的问题是,我没有在正确的地方我的指针/解除引用,我收到编译器警告/错误。我需要做出什么改变才能使其正常工作?函数返回字符[]而不是int

功能:

char time_char[10]; 
time_t rawtime; 
struct tm * timeinfo; 

time (&rawtime); 
timeinfo = localtime (&rawtime); 
int time = timeinfo->tm_yday*1000000 + timeinfo->tm_hour*10000 + timeinfo->tm_min*100 + timeinfo->tm_sec; 

sprintf(time_char, "%d", time); 

和:与char time_char[] = get_time();

我有什么之前,我的代码移动到某个功能,因为我需要它是这样工作

char *get_time() 
{ 
    char time_char[10]; 
    time_t rawtime; 
    struct tm * timeinfo; 

    time (&rawtime); 
    timeinfo = localtime (&rawtime); 
    int time = timeinfo->tm_yday*1000000 + timeinfo->tm_hour*10000 + timeinfo->tm_min*100 + timeinfo->tm_sec; 

    sprintf(time_char, "%d", time); 
    return *time_char; 
} 

调用函数然后根据需要使用time_char

+5

短版本 - 不要。将函数写入预分配数组,如'int get_time(char * out,size_t max_size)' – keltar

回答

4

该数组在函数的调用帧中分配,并在函数返回时解除分配。

您将需要通过指针传递数组(如keltar注释),在这种情况下,您不需要返回任何内容,并且可以将该函数标记为void,或者使用malloc分配内存并返回指针。

+0

理论上,它也可以是静态变量。当然,我不会推荐它 - 稍后会遇到问题,并且不存在线程安全性。 – keltar

+0

是的,这似乎是一个不好的建议,没有更多的解释。 –

1

首先,你不能返回一个指向自动局部变量的指针。其次,要返回一个指针,你不需要一个解引用操作符。

3

你的原型改为:

char *get_time(char *time); 

分配适当的内存time调用函数,然后调用free(time);当你使用它(也调用函数)来完成。

此外,您return语句应该仅仅是:

return time; 
0

虽然一般来说这是不可取的,有时它是返回一个字符数组是有用的,如下:

typedef struct char10 {char str[10];} char10; 

char10 get_time() { 
    char10 time_char; 
    // ... 
    sprintf(time_char.str, "%d", time); 
    return time_char; 
} 

一个缺点是,例如,gcc给出了一个不必要的警告信息,例如:

printf("%s\n", get_time().str); 

你可以通过丑陋避免:

printf("%s\n", &get_time().str[0]); 
相关问题