我需要在结构中封装一个文字字符串。下面的代码不会编译,但希望说明我想做什么?
struct my_struct
{
char* str = "string literal";
};
答案 0 :(得分:16)
您无法初始化结构声明中的任何成员。您必须在创建结构实例时初始化结构。
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;
答案 1 :(得分:1)
您必须创建结构的实例,然后设置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"};
}
答案 2 :(得分:1)
我想你想要这个:
struct my_struct
{
char* z;
};
// ...
struct my_struct s = {"string literal"};
答案 3 :(得分:1)
正如已经给出的答案所示,结构声明和初始化必须是分开的,如果my_struct
的所有实例都需要,则必须始终如一地应用。 C ++提供了更好的解决方案;如果您可以使用C ++编译,那么可以使用构造函数自动执行此操作,如下所示:
struct my_struct
{
my_struct() : str("string literal"){}
char* str ;
};
然后对于my_struct
的所有实例,str将在实例化时指向文字常量"string literal"
。但请注意,这是一个指向const字符串的非常量指针。
答案 4 :(得分:1)
不允许直接初始化。相反,可以做的是使它成为指针并将其指向您想要的字符串。
答案 5 :(得分:1)
另一种方法,但是仍然必须使用默认的初始化实例来初始化新实例。
struct my_struct
{
const char * str;
} ms_def {
.str = "value"
};
int main()
{
my_struct obj = ms_def;
printf("%s\n", obj.str);
return 0;
}