C语言 复合文字中的字符串文字

ddhy6vgd  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(154)

我有一个关于复合文字中的字符串文字的问题。
由于struct S复合字面值的生存期在函数调用周围的块内,我想知道在全局变量gs内使用名称指针是否仍然正确。我猜字符串字面值“foo”没有绑定到复合字面值的生存期,而是驻留在.rodata中?是这样吗?至少gs.name仍然打印foo。

#include <stddef.h>
#include <stdio.h>

struct S
{
    const char *name;
    int size;
};    

static struct S gs;

static void func(struct S *s)
{
    gs = *s;
}

int main(void)
{
    {
        func(&(struct S){.name="foo",.size=20});
    }

    printf("name: %s size: %d\n", gs.name, gs.size);
    return 0;
}
jv4diomz

jv4diomz1#

我猜字符串文字“foo”没有绑定到复合文字的生存期,而是驻留在.rodata中。
是的。没错。在

func(&(struct S){.name="foo",.size=20});

其中"foo"初始化了一个指针,这就好像你写了(如果可以用C写的话):

func(&(struct S){.name=(static const char[]){'f','o','o','\0'},.size=20});

(从技术上讲,C不允许在复合文字上使用static,C的字符串文字实际上是const-char-arrays,但它们的形式类型是char[],没有const(出于奇怪的历史原因))。
在C语言中,你可以使用字符串来初始化数组,如果.name是一个成员数组,那么将“it”(它的衰变指针)存储到一个全局变量是不明智的。

相关问题