ETH官方钱包

前往
大廳
主題

C取時(shí)間和指標(biāo)使用上的一些眉角

Yang | 2023-01-29 15:36:11 | 巴幣 0 | 人氣 181

接續(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ǔ)充
送禮物贊助創(chuàng)作者 !
0
留言

創(chuàng)作回應(yīng)

相關(guān)創(chuàng)作

更多創(chuàng)作