繁体   English   中英

复合文字中的字符串文字

[英]String literal in compound literal

我对复合文字中的字符串文字有疑问。

由于 struct S 复合文字的生命周期在 func 调用周围的块内,我想知道在全局 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;
}

我猜字符串文字“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,但它们的形式类型是没有constchar[] (出于奇怪的历史原因))。

但要小心。 在 C 中,您可以使用字符串文字来初始化 arrays,如果.name是一个成员数组,那么将“它”(它的衰减指针)存储到一个全局变量是不明智的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM