Nó trả về con trỏ đến bộ đệm static
và không được là free()
d. Từ man ctime:
Bốn chức năng asctime(), ctime(), gmtime() và localtime() trả về một con trỏ đến dữ liệu tĩnh và do đó không được thread-safe.
Tiêu chuẩn C99, phần 7.23.3.2 Chức năng ctime bang mà gọi ctime(timer)
chức năng tương đương với asctime(localtime(timer))
, và asctime()
thực hiện (như minh họa trong cùng một tài liệu) tương đương với:
char *asctime(const struct tm *timeptr)
{
static const char wday_name[7][3] = {
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
};
static const char mon_name[12][3] = {
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};
static char result[26];
sprintf(result,
"%.3s %.3s%3d %.2d:%.2d:%.2d %d\n",
wday_name[timeptr->tm_wday],
mon_name[timeptr->tm_mon],
timeptr->tm_mday, timeptr->tm_hour,
timeptr->tm_min, timeptr->tm_sec,
1900 + timeptr->tm_year);
return result;
}
Đối số được chuyển đến free()
phải là một con trỏ được trả về bởi một cuộc gọi đến malloc()
, calloc()
hoặc realloc()
chỉ, nếu không hành vi đó là không xác định.
Chỉ cần thêm rằng nếu bạn muốn có phiên bản an toàn cho chủ đề, hãy sử dụng ctime_r() để thay thế. – Turix
@Turix, yep nó nói rằng trên trang được liên kết. – hmjd
Tôi thực sự nghĩ rằng các mảng đó là '[] [4]' (hoặc, thậm chí tốt hơn, mảng con trỏ để tránh lỗi này). – unwind