c - 是否需要释放用于函数返回变量的内存 (C)?

标签 c memory-management return-value

假设我有以下 C 代码:

void myfunction() {
    time_t     t = 0;
    struct tm  *ct;

    time(&t);
    ct = localtime(&t);
}

如您所见,localtime 函数返回一个指向 struct tm 变量的新指针。据我所知,要使函数返回的变量在调用方上下文中有效,它至少需要满足以下条件之一:

  1. 返回的变量必须在调用者的上下文或与调用者相关的更高上下文中声明。
  2. 返回的变量必须在堆上分配内存。

在我的例子中,第一点不适用,所以认为第二点已经实现是正常的。

我说得对吗?

如果是,那是否意味着我需要在使用完 ct 变量后调用 free ?

如果没有,你能详细一点吗?

谢谢!


编辑:

从回复中,我了解到要求中应该还有另一点,即变量在返回的上下文中可用。那应该是静态变量。还有其他可能吗?

最佳答案

几个较旧的 C 函数返回指向静态缓冲区的指针。 localtime 就是其中之一。您不需要(实际上不应该;如果这样做,您的程序可能会出现段错误)从 localtime 释放返回的指针。

问题是进程空间中只有一个localtime缓冲区,下一次调用localtime(即使在另一个线程中)会覆盖结果之前返回。这就是为什么几乎所有以这种方式运行的函数(strtok 是另一个例子)现在都有新的 _r 版本,将它们的结果放在用户传入的缓冲区中,因此线程安全。

关于c - 是否需要释放用于函数返回变量的内存 (C)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15517380/

相关文章:

c - 如何获得返回数组而不是打印数组的函数?

c - C中的线程本地数据

c - 在 C 中定义以 true 或 false 作为参数的函数的最佳方法是什么

c++ - 这是否被认为是内存泄漏?

c++ - 如何正确清理 vector/ map ?

c - 为什么我偶尔会在测试 1 和测试 3 的输出中出现乱码?

c++ - 函数返回值是否是自动对象并因此保证被破坏?

c++ - RSA解密消息

c - 那会错吗?如果是这样,为什么会这样?输出为2500

java - LIBGDX:InputAdapter 的 keyDown、keyUp 等返回值的含义是什么