【问题标题】:The const char* should it be freed in C?const char* 应该在 C 中释放吗?
【发布时间】:2022-07-26 21:54:16
【问题描述】:

请考虑以下代码。我在问这是否正确,是否缺少某些东西。有没有其他方法可以实现。

#include <stdio.h>
#include <string.h>
const char *getOrder (const char *day)
{
    if (strncmp(day, "Monday", 7) == 0) {
        return "first";
    } else if (strncmp(day, "Tuesday", 7) == 0) {
        return "second";
    } else if (strncmp(day, "Wednesday", 9) == 0) {
        return "third";
    } else if (strncmp(day, "Thursday", 8) == 0) {
        return "forth";
    } else if (strncmp(day, "Friday", 6) == 0) {
        return "fifth";
    } else if (strncmp(day, "Saturday", 8) == 0) {
        return "sixth";
    } else if (strncmp(day, "Sunday", 6) == 0) {
        return "seventh";
    } else
        return NULL;
}
int main()
{
    const char* str = NULL;
    str = getOrder ("Monday");
    printf("str : %s\n", str);
    return 0;
}

【问题讨论】:

  • 只将malloc和相关函数返回的内容传递给free
  • 您的代码中没有任何东西可以释放,因为没有动态内存分配。你如何定义“正确”?例如,getOrder("Fridayear!!!!!") 的预期输出是什么?
  • @Zakk 字符串字面量的数据通常分配在静态数据区,而不是堆栈上。
  • 对我来说看起来不错。但是你绝对可以过度设计这个
  • 建议更改return NULL;return "No match"; 不匹配

标签: c function char constants free


【解决方案1】:

决定你是否必须释放的不是变量的类型,而是它驻留在内存的哪一部分。

如果您使用malloc 或相关函数分配内存,它将存在于heap,因此您必须对它们调用free

在您的示例中,这些字符串是在 static memory 中创建的(不是从其中一个 cmets 中建议的堆栈中创建的,否则一旦函数返回,您就无法使用它,因为它们会被覆盖)。

这些字符串被编译成运行时二进制文件本身(你可以运行strings &lt;your binary&gt;,你会看到它们。一旦程序加载,内存的一个特殊区域会为这些常量数据保留,因此你不需要'不需要释放它。

附带说明,您必须从右到左阅读 C/C++ 类型,所以 type const char* 表示你有一个指向常量字符串的指针。这意味着你不能修改它所指向的字符串,但它并没有说明这个指针后面的内存是如何分配的。它可能在堆上、stack 或静态内存上,只是类型不会告诉你。

【讨论】:

  • 你能链接一个参考如何使用strings &lt;your binary&gt;吗?我不熟悉它。
  • @ryyker 只需在命令行中输入(将&lt;your binary&gt; 替换为您的二进制文件名)。
  • 如果您使用的是 Linux 或任何 UNIX,只需在终端中运行 man strings 即可查看文档。如果您使用的是 Windows,则需要 WSL 或 cygwin 或其他工具来获得此功能。不过这并不重要,它只是表明字符串文字由编译器存储在可执行文件中。
  • 此外,如果您在代码中编写了strdup("first"),您仍然会在可执行文件中看到这些字符串,并且您需要free。老实说,在考虑strings之前先担心对象的生命周期
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-16
  • 2011-03-21
  • 2017-04-01
  • 1970-01-01
  • 2013-11-15
  • 1970-01-01
  • 2014-01-25
相关资源
最近更新 更多