2012-06-29 26 views
5

nguyên mẫu của hàm ctimectime() trả về một chuỗi, tại sao chúng ta không cần giải phóng() bộ nhớ của chuỗi ký tự này?

char *ctime(const time_t *timep); 

Như chúng ta có thể thấy, nó trả về một chuỗi. nhưng, nơi sting được chứa?

và tại sao chúng ta không nên giải phóng bộ nhớ của chuỗi

Đây là mẫu mã sẽ nhận được một thông báo lỗi rất nhiều

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

*** glibc phát hiện *** ./a.out: free(): con trỏ không hợp lệ: 0x00007f0b365b4e60 ***

Trả lời

8

Nó trả về con trỏ đến bộ đệm static và không được là free() d. Từ man ctime:

Bốn chức năng asctime(), ctime(), gmtime() và localtime() trả về một con trỏ đến dữ liệu tĩnh và do đó không được thread-safe.

Tiêu chuẩn C99, phần 7.23.3.2 Chức năng ctime bang mà gọi ctime(timer) chức năng tương đương với asctime(localtime(timer)), và asctime() thực hiện (như minh họa trong cùng một tài liệu) tương đương với:

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

Đối số được chuyển đến free() phải là một con trỏ được trả về bởi một cuộc gọi đến malloc(), calloc() hoặc realloc() chỉ, nếu không hành vi đó là không xác định.

+5

Chỉ cần thêm rằng nếu bạn muốn có phiên bản an toàn cho chủ đề, hãy sử dụng ctime_r() để thay thế. – Turix

+0

@Turix, yep nó nói rằng trên trang được liên kết. – hmjd

+0

Tôi thực sự nghĩ rằng các mảng đó là '[] [4]' (hoặc, thậm chí tốt hơn, mảng con trỏ để tránh lỗi này). – unwind

1

Nó trỏ đến dữ liệu tĩnh và không phải là malloc'd.

Các vấn đề liên quan