2012-06-29 58 views
5

fonksiyonunun ctime prototipi Gördüğümüz gibi, bir dize döndürürctime() bir dize döndürüyor, neden bu dizenin belleğini boşaltmaya gerek yok()?

char *ctime(const time_t *timep); 

olduğunu. ama, nerede sokulduğu?

ve biz dize ait hafızasını boşaltmak gerekir neden

Bu örnek kod hata mesajının bir sürü alacak olan

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

*** glibc tespit *** ./a.out: free(): geçersiz işaretçi: 0x00007f0b365b4e60 ***

cevap

8

static arabelleğine bir işaretçi döndürür ve free() d olmamalıdır. man ctime Gönderen:

dört fonksiyonları asctime(), ctime(), gmtime() ve localtime() evreli olmayan dolayısıyla statik verileri gösteren bir işaretçi dönmek ve.

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 standart bölüm 7.23.3.2 (aynı dokümanda gösterildiği gibi) ctime(timer) işlevinin çağrılması asctime(localtime(timer)) eşdeğer olduğunu ctime işlevi durumları ve asctime() uygulama eşdeğerdir

free()'a iletilen argüman, yalnızca malloc(), calloc() veya realloc() numaralı çağrılarla döndürülen bir işaretçi olmalıdır, aksi halde davranış tanımsızdır.

+5

Yalnızca iş parçacığı için güvenli bir sürüm istiyorsanız, bunun yerine ctime_r() öğesini kullanın. – Turix

+0

@Turix, bağlantılı sayfada olduğunu belirtiyor. – hmjd

+0

Gerçekten bu dizilerin '[] [4]' (ya da daha da iyisi, bu hatayı önlemek için işaretçi dizileri) olduğunu düşünüyorum. – unwind

1

Statik verilere işaret ediyor ve hatalı değildi.