獲取文件修改時間並格式化為字符串返回,涉及函數內部緩衝區的生命周期管理。三種方案對應三種內存策略:
char global_buffer[120]; // 全局數組
char *local_time_v1(char *filename) {
struct stat st; stat(filename, &st);
struct tm *tm = localtime(&st.st_mtime);
strftime(global_buffer, sizeof(global_buffer), "%a %b %e %T %Y", tm);
return global_buffer; // 返回全局地址
}
優點: 簡單,無需調用者釋放。
缺點: 非線程安全,多次調用數據覆蓋,無法並發使用。
char *local_time_v2(char *filename) {
struct stat st; stat(filename, &st);
struct tm *tm = localtime(&st.st_mtime);
char *buf = malloc(120);
strftime(buf, 120, "%a %b %e %T %Y", tm);
return buf; // 調用者必須 free()
}
優點: 線程安全,每次調用獨立內存。
缺點: 易忘記 free() 導致內存洩漏,調用約定複雜。
char *local_time_v3(char *filename) {
struct stat st; stat(filename, &st);
struct tm *tm = localtime(&st.st_mtime);
static char buf[120]; // 靜態局部變量
strftime(buf, sizeof(buf), "%a %b %e %T %Y", tm);
return buf;
}
優點: 無全局污染,調用簡單。
缺點: 同方案一,非線程安全,數據會被後續調用覆蓋。
int main() {
char *s = "/root/date.c";
#if CHOICE == 1
char *p = local_time_v1(s); printf("%s\n", p);
#elif CHOICE == 2
char *p = local_time_v2(s); printf("%s\n", p); free(p);
#else
char *p = local_time_v3(s); printf("%s\n", p);
#endif
return 0;
}
thread_local 關鍵字實現線程局部存儲char *buf, size_t size,所有權清晰std::string,RAII 自動管理「返回指向內部緩衝區的指針」是 C 語言經典陷阱。全局/靜態變量 簡單但非線程安全;動態分配 靈活但易洩漏;調用者分配 最清晰安全。實際項目中推薦「調用者提供緩衝區」或 C++ std::string,避免所有權模糊。