C 中的 static const char* VS const char*

static const char* VS const char* in C

C语言中的const char*static const char*有什么区别?

我认为Difference between static const char* and const char*的答案是错误的

确实,const char*个元素放在程序的.rodata段,否则下面会导致段错误:

const char* f() {
    const char* hello = "hello";
    return hello;
}

int main() {
    const char* hello_after = f();
    printf("%s\n", hello_after);
}

的确,因为那个代码有效,f返回的指针仍然指向存活的数据,这表明数据没有分配到堆栈上,而是存储在.rodata中。

但是,在我看来 const char*static const char* 就 GCC 而言是相同的东西。

但是,为什么 const int*static const int* 的行为不一样?这是一个例外,在 GCC 中硬编码,仅针对类型 char 然后 conststatic const 应该相同吗?

非常感谢您的帮助!

在此函数声明中

const char* f() {
    const char* hello = "hello";
    return hello;
}

指针 hello 指向具有静态存储持续时间的字符串文字 "hello"。也就是说,它不是具有静态存储持续时间的指针,而是具有静态存储持续时间的指向文字。在函数的每次调用中,指针都会重新初始化。

如果你将函数声明为

const char* f( ) {
    static const char* hello = "hello";
    return hello;
}

那么在这种情况下,指针本身具有静态存储持续时间。它在程序获得控制之前被初始化一次,并且它的值在函数调用之间保持。

例如考虑这个演示程序。

#include <stdio.h>

const char* f( int i ) 
{
    static const char* hello = "hello";

    if ( i == 1 ) hello = "bye";
    else if ( i == -1 ) hello = "hello";

    return hello;
}

int main(void) 
{
    puts( f( 0 ) );
    puts( f( 1 ) );
    puts( f( 0 ) );

    return 0;
}

它的输出是

hello
bye
bye

最初指针 hello 是由字符串文字 "hello" 初始化的。

然后由于这个电话

    puts( f( 1 ) );

它的值被改变了。现在它指向字符串文字 "bye".

第三次调用

    puts( f( 0 ) );

指针保留上次调用函数时分配给它的值。

这是因为指针有静态存储期限。