2012-06-29 35 views

Odpowiedz

8

Powoduje zwrócenie wskaźnika do bufora static i nie może być free() d. Od man ctime:

czterech funkcji asctime(), ctime(), gmtime() i localtime() zwraca wskaźnik do danych statycznych, a tym samym nie są bezpieczny wątku.

Standard C99, sekcja 7.23.3.2 Funkcja ctime stwierdza, że ​​wywołanie ctime(timer) funkcji jest równoznaczne z asctime(localtime(timer)) i realizacja asctime() (jak pokazano w tym samym dokumencie) jest równoważne:

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

Argument przekazany do free() musi być wskaźnikiem zwróconym tylko przez wywołanie do malloc(), calloc() lub realloc(), w przeciwnym razie zachowanie jest niezdefiniowane.

+5

Po prostu dodając, że jeśli chcesz wersję wątkową, użyj ctime_r(). – Turix

+0

@Turix, tak to stwierdza na tej stronie. – hmjd

+0

Naprawdę uważam, że te tablice to '[] [4]' (lub, jeszcze lepiej, tablice wskaźników, aby uniknąć tego błędu). – unwind

1

Wskazuje na dane statyczne i nie jest malloc'd.