我有一个关于复合文字中的字符串文字的问题。
由于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;
}
1条答案
按热度按时间jv4diomz1#
我猜字符串文字“foo”没有绑定到复合文字的生存期,而是驻留在.rodata中。
是的。没错。在
其中
"foo"
初始化了一个指针,这就好像你写了(如果可以用C写的话):(从技术上讲,C不允许在复合文字上使用
static
,C的字符串文字实际上是const-char-arrays,但它们的形式类型是char[]
,没有const
(出于奇怪的历史原因))。在C语言中,你可以使用字符串来初始化数组,如果
.name
是一个成员数组,那么将“it”(它的衰变指针)存储到一个全局变量是不明智的。