簡體   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