在没有malloc/buffer的情况下是否可以返回字符串文字

在没有malloc/buffer的情况下是否可以返回字符串文字,c,C,以下C代码返回字符串文字是否有效/可接受 char* level_str(level) { switch (level) { case DEBUG: return "DEBUG"; case INFO: return "INFO"; case WARN: return "WARN"; case ERROR: return "ERROR";

以下C代码返回字符串文字是否有效/可接受

char* level_str(level)
{
    switch (level) {
        case DEBUG: return "DEBUG";
        case INFO:  return "INFO";
        case WARN:  return "WARN";
        case ERROR: return "ERROR";
        default:    return "UNKNOWN";
    }
}
或者,函数返回后,指向字符串文本的指针是否在堆栈上变为无效/重写?如果是这样,那么只有两种有效的方法可以做到这一点:(1)malloc字符串;或者(2)写入被调用方提供的缓冲区

在没有malloc/buffer的情况下是否可以返回字符串文字

对。可以重新调整字符串文本的地址

OP的代码很好,但最好是
const char*level\u str(level)
,因为数据
const char*
指向,并且最好不要试图更改字符串文本


尝试更改字符串文字是未定义的行为(UB)。可能会工作,可能不会工作,可能会崩溃等。

是的,字符串文字充当指向具有静态存储持续时间的
char
数组的指针,并用给定字符加上终止null初始化。这意味着它类似于您编写的
静态字符my_debug_string[]={'D','E','B','U','G',0}
并返回指向
my_debug_string
的指针(除非您不能修改数组)。特别是,该数组的生存期是程序的整个生存期;它在出现的函数返回后仍然有效


参考:C17标准6.4.5(6-7)。

字符串文字存储在
仅准备就绪
部分,不在堆栈上。所以从函数返回指向它的指针是安全的。@chux,你能澄清一下这是什么意思吗?这是否意味着指针/
char*
进入了
rax
中,被调用方可以使用它,因此字符串文本是好的?关键是字符串文本的地址(例如,
“hello world”
)是固定的,并且对程序的生命周期有益。因此,当函数返回时,该地址不会被破坏(它只是作为可执行文件一部分的只读文本)。因此,与在函数堆栈上创建的本地声明数组不同,可以声明字符串文本地址并从函数返回。在编译时,编译器会看到
“hello world”
,并将其作为可执行文件
.rodata
部分的一部分。使用
字符数组[12]编译器不知道它将是什么。@DavidC.Rankin“作为可执行文件的一部分的只读文本//”是一个实现细节-尽管很常见。代码和环境都不需要“只读”部分。好的,地球上几乎所有其他编译器,除了Microsoft编写的不符合标准的编译器外,字符串文字都位于可执行文件的只读.rodata部分。。。但是,要知道这是一个实现细节,并且有一个非常流行的编译器,它允许您更改字符串文本,这与世界上大多数其他地方的做法相反。
:)
“如果程序试图修改这样的数组,行为是未定义的。”