首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >const char*应该在C中释放吗?

const char*应该在C中释放吗?
EN

Stack Overflow用户
提问于 2022-07-26 13:29:53
回答 3查看 213关注 0票数 2

请考虑以下代码。我要问的是,如果这是正确的,是否有什么遗漏。还有别的办法可以做吗。

代码语言:javascript
复制
#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;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-07-26 22:21:02

if/else梯子过于复杂,容易出现“复制/粘贴”错误。

似乎您需要一个“查找表”来将一个工作日的名称转换为一个不同的字符串。

代码语言:javascript
复制
const char *getOrder (const char *day) {
    char *LUT[][2] = {
    { "Monday", "first", },
    { "Tuesday", "second", },
    { "Wednesday", "third", },
    { "Thursday", "forth", },
    { "Friday", "fifth", },
    { "Saturday", "sixth", },
    { "Sunday", "seventh", },
    };
    
    for( i = 0; i < sizeof(LUT)/sizeof(LUT[0]); i++ )
        if( strncmp(day, LUT[i][0], strlen( LUT[i][0] ) ) == 0 )
            return LUT[ i ][ 1 ];

    return "NOT A DAY NAME";
}

它还在反复搜寻..。

下面是一个很小的散列函数,用于快速将字符串日期名称转换为整数值(大小写不敏感)。玩玩它。也许你会试着把这个调整成合理的平日名称。

代码语言:javascript
复制
// Convert a day name (or 3 letter abbrev.) to index (1-7, Sun=1). Beware false positives!
static int wkdayOrd( char cp[] ) { return "65013427"[*cp/2 + ~cp[1] & 0x7] & 0x7; }
票数 3
EN

Stack Overflow用户

发布于 2022-07-26 13:44:42

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

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

在您的示例中,这些字符串是在静态存储器中创建的(不是按照其中一个注释中的建议从堆栈中创建的,否则在函数返回时不能使用它,因为它们本来会被覆盖)。

这些字符串被编译成运行时二进制本身(您可以运行strings <your binary>并看到它们)。一旦程序被加载,内存中的一个特殊区域将被保留给这样的常量数据,因此您不需要释放它。

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

票数 4
EN

Stack Overflow用户

发布于 2022-07-26 14:14:48

结论是否定的。

原因是free()应该用作malloc()、calloc()或realloc()的合作伙伴。或者说,那些alloc函数只返回一个指针,那么它是否可以由free()回收。

一个附加的原因是,您在代码中编写的所有字符串都分配在.rodata节中,这意味着这些字符串加载在内存空间中,您不能编辑而只能读取,所以即使存在释放它们的方法,您仍然不能使用内存空间。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73124321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档