【问题标题】:ctime() return a string, why we don't need to free() this string' s memory?ctime() 返回一个字符串,为什么我们不需要 free() 这个字符串的内存?
【发布时间】:2012-06-30 17:57:35
【问题描述】:

函数ctime的原型是

char *ctime(const time_t *timep);

如我们所见,它返回一个字符串。但是,刺痛在哪里?

以及为什么我们不应该释放字符串的内存

这是示例代码会得到很多错误信息

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

*** 检测到 glibc *** ./a.out: free(): invalid pointer: 0x00007f0b365b4e60 ***

【问题讨论】:

    标签: c string memory-management heap-memory stack-memory


    【解决方案1】:

    它指向静态数据并且不是 malloc 的。

    【讨论】:

      【解决方案2】:

      它返回一个指向static缓冲区的指针,并且不能是free()d。来自man ctime

      asctime()、ctime()、gmtime() 和 localtime() 这四个函数返回一个指向静态数据的指针,因此不是线程安全的。

      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() 返回的指针,否则行为未定义。

      【讨论】:

      • 只是补充一点,如果你想要一个线程安全的版本,使用 ctime_r() 代替。
      • @Turix,是的,它在链接页面上说明了这一点。
      • 我真的认为这些数组是[][4](或者,更好的是,避免这个错误的指针数组)。
      • 所以,它在全局内存中分配。当我们一次又一次地调用函数时,它不会被填写吗?
      • @Vamshi 是的,最好在调用后立即从静态内存中复制数据。
      猜你喜欢
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      • 2017-09-19
      • 2021-05-12
      • 2016-01-18
      相关资源
      最近更新 更多