【问题标题】:Where the memory to the variable returned by library function is allocated分配给库函数返回的变量的内存的位置
【发布时间】:2015-04-15 21:26:22
【问题描述】:

在下面的程序中

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 的堆栈中,即使函数已将控制权返回给我,我如何访问它?如果它在调用者函数的堆栈中,它如何不破坏调用者堆栈的任何数据?我所理解的是它必须在用户空间中分配。

【问题讨论】:

  • asctime 上的哪些参考资料没有提到这一点?
  • the documentation of asctime() 的返回值部分,您可能会找到答案。
  • @WhozCraig 找到了答案

标签: c linux memory glibc


【解决方案1】:

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

【讨论】:

  • 这是否意味着只有在程序死亡或被杀死时才会释放内存
  • 是的,当程序死亡或被杀死时释放静态内存
【解决方案2】:

asctimecppreference 的文档中说:

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

【讨论】:

    【解决方案3】:

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

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

    1. 指针分配在哪里?
    2. 指向的字符串分配在哪里?

    答案是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      • 1970-01-01
      • 2022-07-02
      • 1970-01-01
      • 2021-10-22
      相关资源
      最近更新 更多