静态c函数可以返回一个本地字符数组吗?

ozg*_*gur 1 c string return string-literals storage-duration

在zflog库中,我看到了这段代码

static char* lvl_char(const int lvl)
{
    switch (lvl)
    {
    case ZF_LOG_VERBOSE:
        return "VERBOSE\0";
    case ZF_LOG_DEBUG:
        return "DEBUG\0";
    case ZF_LOG_INFO:
        return "INFO\0";
    case ZF_LOG_WARN:
        return "WARN\0";
    case ZF_LOG_ERROR:
        return "ERROR\0";
    case ZF_LOG_FATAL:
        return "FATAL\0";
    default:
        ASSERT_UNREACHABLE("Bad log level");
        return "?\0";
    }
}
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎很奇怪.我们真的可以从静态函数返回一个本地c字符串吗?

Ant*_*ala 6

函数的链接(这里是静态的)根本不重要.也没有返回"字符串"; 而是返回的是指向char的指针.将指针返回到字符串文字的第一个字符是完全合法的 - 字符串文字保证在程序的整个持续时间内存在.C11 6.4.5p6声明这里使用的字符串文字用于初始化*" 静态存储持续时间和长度的[匿名]数组,只足以包含序列".静态存储持续时间意味着它的"生命周期是程序的整个执行,其存储的值仅在程序启动之前初始化一次".(C11 6.2.4p3).


该物件确实看起来很奇怪的是\0在字符串文字的端部,作为文字串总是0封端,因此基本上"VERBOSE\0"将被刚刚终止2零个字节,而不是通常的一个; strlen对于该字符串将返回7正如它将返回"VERBOSE",等等.

  • @ozgur 1)它们是字符串“文字” 2)没有本地内容,文字具有静态存储持续时间。 (2认同)

LPs*_*LPs 5

你错了,返回的指针不指向本地char array,而是指向a string literal,即为static进程.

c标准

6.4.5字符串文字

语义学对

在转换阶段7中,将值为零的字节或代码附加到由字符串文字或文字产生的每个多字节字符序列.78)然后使用多字节字符序列初始化静态存储持续时间和长度的数组,该数组足以满足包含序列.[...]

Emèphasis矿