2012-06-29 9 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であってはなりません。 4つの関数のいるasctime(

)、CTIME()、のgmtime()とlocaltimeの()は、静的データへのポインタを返す、したがって、スレッドセーフではない:man ctimeから。

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

C99標準では、セクション7.23.3.2(同文献に示されているように)ctime(timer)関数を呼び出すことasctime(localtime(timer))に等価であることのctime関数状態、及びasctime()実装は、と等価です

free()に引き渡される引数は、malloc(),calloc()またはrealloc()にのみコールされたポインタでなければなりません。それ以外の場合は動作は定義されていません。

+5

スレッドセーフバージョンを使用する場合は、代わりにctime_r()を使用してください。 – Turix

+0

@Turix、それはリンクされたページでそれを述べます。 – hmjd

+0

私は本当にそれらの配列が '[] [4]'(あるいは、このバグを避けるためのより良いポインタ配列)だと思います。 – unwind

1

これは静的なデータを指し、mallocされませんでした。

関連する問題