其中分配了库函数返回的变量的内存

时间:2015-02-15 05:26:35

标签: c linux memory glibc

在以下程序中

int main(){
char * time;
struct tm timeptr;
t.tm_sec = 10;
t.tm_min = 10;
t.tm_hour = 6;
t.tm_mday = 25;
t.tm_mon = 2;
t.tm_year = 89;
t.tm_wday = 6;
time = asctime(&timeptr);
puts(time);
}

asctime()返回的内存到字符串的位置是什么?我的意思是它分配在堆或调用者/被调用函数的堆栈中还是在其他地方?如果它在堆中那么我需要释放它吗?如果它在asctime的堆栈中,即使函数已将控件返回给我,我也可以访问它?如果它在调用函数的堆栈中它是如何不破坏调用者堆栈的任何数据的?我理解的是它必须在用户空间中分配。

3 个答案:

答案 0 :(得分:0)

返回的值是从静态区域计算出来的;这不是堆。 因此,对asctime的后续调用将修改先前返回的指针指向的字符串。无需释放返回的指针。

答案 1 :(得分:0)

cppreferenceasctime文档中说:

  

返回值   指向包含日期和时间的文本表示的静态以空字符结尾的字符串的指针。该字符串可以在asctimectime之间共享,并且可以在每次调用任何这些函数时被覆盖。

答案 2 :(得分:0)

asctime返回指向字符串的指针。

可以提出两个可能的问题。

  1. 指针的分配位置?
  2. 指向字符串的位置在哪里?
  3. 答案是:

    1. 编译器编写者决定分配它(通常在寄存器中,但对于较大的返回类型,它可能在堆栈中)。
    2. 函数编写者决定分配它的位置。它可以合理地是静态数组或堆分配数组。要知道,您需要阅读功能文档。对于asctime,它是一个静态的arrray。对于其他功能,它可能是其他功能。