2014-03-18 92 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]); 
相關問題