2012-06-29 2 views
5

прототип функции ctime являетсяctime() возвращает строку, почему нам не нужно освобождать() память этой строки?

char *ctime(const time_t *timep); 

Как мы видим, он возвращает строку. но, где содержится жало?

и почему мы не должны освободить память струны

Это пример коды получит много сообщений об ошибках

char *p; 
p = ctime(...); 
... 
free(p); 

*** Glibc обнаружено *** ./a.out: free(): неверный указатель: 0x00007f0b365b4e60 ***

ответ

8

Он возвращает указатель на буфер static и не должен быть free() d. От man ctime:

Четыре функции asctime(), CTime(), gmtime() и МестноеВремя() возвращает указатель на статические данные и, следовательно, не являются поточно-безопасными.

Стандарт C99, раздел 7.23.3.2 CTime функция состояния, что вызов функции ctime(timer) эквивалентно asctime(localtime(timer)) и asctime() осуществления (как показано в том же документе) эквивалентно:

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; 
} 

Аргумент, переданный free(), должен быть указателем, возвращаемым вызовом только malloc(), calloc() или realloc(), в противном случае поведение не определено.

+5

Просто добавьте, что если вы хотите потокобезопасную версию, используйте ctime_r(). – Turix

+0

@Turix, да, это означает, что на связанной странице. – hmjd

+0

Я действительно думаю, что эти массивы '[] [4]' (или, что еще лучше, массивы указателей, чтобы избежать этой ошибки). – unwind

1

Он указывает на статические данные и не был malloc'd.

 Смежные вопросы

  • Нет связанных вопросов^_^