2016-03-04 28 views
0

我最近想出了一個問題,使用的代碼:如何在不改變原始tm結構的情況下使用mktime()?

time_t today_t; 
time(&today_t); 
tm *today = localtime(&today_t); 

time_t tomorrow_t = mktime(today); 
tomorrow_t += 86400; 
tm *tomorrow = localtime(&tomorrow_t); 

的問題是,我今天對象發生變化之後,我使用本地時間(& tomorrow_t),共創明天對象,並且兩個對象的值相等。我不太瞭解這種行爲。請幫忙嗎?

+3

'time(&time_t)'應該是'time(today_t)'?請複製粘貼您的代碼,不要手動編寫僞造版本 –

+0

'today_t'是變量的一個不好名稱。 '_t'後綴通常用於類型。 –

回答

3

localtimetm結構使用單個靜態變量並返回一個指向它的指針。因此,todaytomorrow將具有相同的地址。

有一個可重入版本localtime_r需要第二個參數,您可以在其中指定結構數據的放置位置。

0

引述的Linux手冊頁localtime功能:

返回值指向靜態分配結構可能 的後續調用任何日期和時間 功能的覆蓋。 localtime_r()函數的功能相同,但將數據存儲在用戶提供的結構中。

因此,如果您撥打localtime()兩次,每次都會返回相同的指針值,並用新值覆蓋它。 today是一個struct tm*指針,你擁有它; *today是一個struct tm對象,它由C庫擁有。

在調用之後將結構(而不​​是指針)複製到另一個struct tm對象,或者使用localtime_r寫入您提供的結構。 (localtime_r不是100%便攜式;它由POSIX定義,但不是由ISO C標準定義。)

+0

非常感謝所有的答案,特別是對於這個答案! –

相關問題