[英]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,但它們的形式類型是沒有const
的char[]
(出於奇怪的歷史原因))。
但要小心。 在 C 中,您可以使用字符串文字來初始化 arrays,如果.name
是一個成員數組,那么將“它”(它的衰減指針)存儲到一個全局變量是不明智的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.