接續(xù)之前寫的,C語言的sizeof(long)和下一個(gè)千禧蟲問題,這裡紀(jì)錄C取時(shí)間和指標(biāo)使用上的一些眉角
參考網(wǎng)頁:
//1970/1/1開始經(jīng)過多少秒
const time_t rawTime = time(NULL);
//轉(zhuǎn)成本地時(shí)間(本機(jī)作業(yè)系統(tǒng)時(shí)間)並使用struct tm資料格式
const struct tm *timeNowStruct = localtime(&rawTime);
//轉(zhuǎn)成Www Mmm dd hh:mm:ss yyyy格式
const char *timeNowStr = asctime(timeNowStruct);
struct tm {
int tm_sec; /* seconds, range 0 to 59 */
int tm_min; /* minutes, range 0 to 59 */
int tm_hour; /* hours, range 0 to 23 */
int tm_mday; /* day of the month, range 1 to 31 */
int tm_mon; /* month, range 0 to 11 */
int tm_year; /* The number of years since 1900 */
int tm_wday; /* day of the week, range 0 to 6 */
int tm_yday; /* day in the year, range 0 to 365 */
int tm_isdst; /* daylight saving time */
};
參考網(wǎng)頁:
localtime和asctime回傳的是指標(biāo),會(huì)指向一個(gè)static的記憶體空間,因此非執(zhí)行緒安全
如果要修改localtime或asctime的回傳值,應(yīng)該要先把資料複製出來,再做調(diào)整
//複製純數(shù)值資料結(jié)構(gòu)
struct tm timeNowStruct = *(struct tm *)localtime(&rawTime);
//把a(bǔ)sctime複製到指定的char array
char buffer[32];
memset(buffer, 0, sizeof(buffer));
const char *_buf = asctime(localtime(&rawTime));
size_t len = strlen(_buf);
memcpy(buffer, _buf, len);
另外,因?yàn)閘ocaltime和asctime回傳的是一個(gè)static的記憶體空間,所以用完不需要釋放(free)
再參考網(wǎng)頁:
自行設(shè)計(jì)的方法,如果要回傳char *,
方法一是學(xué)asctime,宣告一塊static的記憶體空間
方法二是使用strdup,動(dòng)態(tài)new一塊記憶體空間,但用完要記得釋放(free)
方法二是寫C最危險(xiǎn)的地方,沒有g(shù)arbage collection,要自己管理記憶體的使用,
記憶體用完忘記釋放,時(shí)間久了可能會(huì)塞爆機(jī)器,
已經(jīng)釋放(free)的指標(biāo),如果沒管理好,不小心再釋放一次,程式會(huì)立刻當(dāng)?shù)?/div>
方法三是在程式啟動(dòng)時(shí)把會(huì)使用的記憶體都先宣告好,
程式運(yùn)行中只會(huì)使用事先宣告好的記憶體空間,
方法三的細(xì)節(jié)之後補(bǔ)充