[英]String literal inside struct - C
我需要在結構中封裝一個文字字符串。 下面的代碼不會編譯,但希望說明我想做什么?
struct my_struct
{
char* str = "string literal";
};
您無法初始化結構聲明中的任何成員。 您必須在創建結構實例時初始化結構。
struct my_struct
{
char* str;
};
int main(int argc,char *argv[])
{
struct my_struct foo = {"string literal"};
...
}
由於您希望str
成員引用字符串文字,因此您最好將其設為const char *str
,因為您無法以任何方式修改字符串文字。
每次都將結構初始化為已知狀態。
struct my_struct
{
const char* str;
int bar;
};
void init_my_struct(strut my_struct *s)
{
s->str = "string literal";
s->bar = 0;
}
int main(int argc,char *argv[])
{
struct my_struct foo;
init_my_struct(&foo);
struct my_struct
{
const char* str;
int bar;
};
#define MY_STRUCT_INITIALIZER {"string literal",0}
int main(int argc,char *argv[])
{
struct my_struct foo = MY_STRUCT_INITALIZER;
struct my_struct
{
const char* str;
int bar;
};
const struct my_struct my_struct_init = {"string_literal",0};
int main(int argc,char *argv[])
{
struct my_struct foo = my_struct_init;
不允許直接初始化。 相反,可以做的是使它成為指針並將其指向您想要的字符串。
您必須創建結構的實例,然后設置str
成員。 如果你計划使用字符串文字,你真的應該將它改為const char* str
。
struct my_struct
{
const char* str;
};
int main() {
struct my_struct s1;
s1.str = "string literal";
/* or */
struct my_struct s2 = {"string literal"};
}
我想你想要這個:
struct my_struct
{
char* z;
};
// ...
struct my_struct s = {"string literal"};
正如已經給出的答案所示,結構聲明和初始化必須是分開的,如果my_struct
所有實例都需要它,則必須一致地應用它。 C ++提供了更好的解決方案; 如果您可以使用C ++編譯,那么可以使用構造函數自動執行此操作,如下所示:
struct my_struct
{
my_struct() : str("string literal"){}
char* str ;
};
然后對於my_struct
所有實例,str將在實例化時指向文字常量"string literal"
。 但要注意,這是一個指向const字符串的非const指針。
另一種方法,但仍然必須使用默認初始化實例來初始化新實例。
struct my_struct
{
const char * str;
} ms_def {
.str = "value"
};
int main()
{
my_struct obj = ms_def;
printf("%s\n", obj.str);
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.