the prototype of the function ctime is
char *ctime(const time_t *timep);
As we can see, it return a string. but, where the sting be contained?
and why we shouldn't free the string's memory
This is sample code will get a lots of error message
char *p;
p = ctime(...);
...
free(p);
*** glibc detected *** ./a.out: free(): invalid pointer: 0x00007f0b365b4e60 ***
The ctime() function returns the pointer returned by asctime() with that broken-down time as an argument. On successful completion, ctime_r() returns a pointer to the string pointed to by buf. When an error is encountered, a NULL pointer is returned.
The ctime() function in C++ converts the given time since epoch to a calendar local time and then to a character representation. A call to ctime(time) is a combination of asctime() and localtime() functions, as asctime(localtime(time)) . It is defined in <ctime> header file.
It returns a pointer to a static buffer, and must not be free()d. From man ctime:
The four functions asctime(), ctime(), gmtime() and localtime() return a pointer to static data and hence are not thread-safe.
The C99 standard, section 7.23.3.2 The ctime function states that calling ctime(timer) function is equivalent to asctime(localtime(timer)), and the asctime() implementation (as illustrated in the same document) is equivalent to:
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;
}
The argument passed to free() must be a pointer returned by a call to malloc(), calloc() or realloc() only, otherwise the behaviour is undefined.
It points to static data and wasn't malloc'd.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With