有什么方法可以初始化动态分配的结构?
Any way to initialize a dynamically allocated structure?
C11 为我们提供了简洁的结构初始化语法:
struct some_struct {int some; char value;};
struct some_struct s = {.some = 5, .value = 'a'};
printf("some = %d, value = %c\n", s.some, s.value);
但是,当必须动态分配结构时,它似乎不起作用:
struct some_struct {int some; char value;};
struct some_struct *s = malloc(sizeof(struct some_struct));
*s = {.some = 5, .value = 'a'};
printf("some = %d, value = %c\n", s->some, s->value);
此代码产生:
error: expected expression before ‘{’ token
*s = {.some = 5, .value = 'a'};
^
struct some_struct {int some; char value;};
struct some_struct *s = malloc(sizeof(struct some_struct));
*s = struct some_struct {.some = 5, .value = 'a'};
printf("some = %d, value = %c\n", s->some, s->value);
这段代码产生:
error: expected expression before ‘struct’
*s = struct some_struct {.some = 5, .value = 'a'};
^~~~~~
在 C 中有没有什么方法可以很好地初始化动态分配的结构,或者我宁愿必须编写类似的东西:
struct some_struct {int some; char value;};
struct some_struct *s = malloc(sizeof(struct some_struct));
s->some = 5;
s->value = 'a';
printf("some = %d, value = %c\n", s->some, s->value);
这有点不方便,因为 (a) 这意味着结构的每个成员都必须占据自己的行,因为当人们看到 ;
符号不是其行的最后一个符号时,他们往往会皱眉在源代码中,并且 (b) 我无法依赖未指定的值被初始化为 0
,就像在正常结构初始化中发生的那样。
在你的代码中
*s = {.some = 5, .value = 'a'};
是不是一个initialization, it's an assignment。
Brace enclosed initializer只能在初始化时使用。
不过,您可以使用 compound literal。像
*s = (struct some_struct){.some = 5, .value = 'a'};
会完成任务的。
C11 为我们提供了简洁的结构初始化语法:
struct some_struct {int some; char value;};
struct some_struct s = {.some = 5, .value = 'a'};
printf("some = %d, value = %c\n", s.some, s.value);
但是,当必须动态分配结构时,它似乎不起作用:
struct some_struct {int some; char value;};
struct some_struct *s = malloc(sizeof(struct some_struct));
*s = {.some = 5, .value = 'a'};
printf("some = %d, value = %c\n", s->some, s->value);
此代码产生:
error: expected expression before ‘{’ token
*s = {.some = 5, .value = 'a'};
^
struct some_struct {int some; char value;};
struct some_struct *s = malloc(sizeof(struct some_struct));
*s = struct some_struct {.some = 5, .value = 'a'};
printf("some = %d, value = %c\n", s->some, s->value);
这段代码产生:
error: expected expression before ‘struct’
*s = struct some_struct {.some = 5, .value = 'a'};
^~~~~~
在 C 中有没有什么方法可以很好地初始化动态分配的结构,或者我宁愿必须编写类似的东西:
struct some_struct {int some; char value;};
struct some_struct *s = malloc(sizeof(struct some_struct));
s->some = 5;
s->value = 'a';
printf("some = %d, value = %c\n", s->some, s->value);
这有点不方便,因为 (a) 这意味着结构的每个成员都必须占据自己的行,因为当人们看到 ;
符号不是其行的最后一个符号时,他们往往会皱眉在源代码中,并且 (b) 我无法依赖未指定的值被初始化为 0
,就像在正常结构初始化中发生的那样。
在你的代码中
*s = {.some = 5, .value = 'a'};
是不是一个initialization, it's an assignment。
Brace enclosed initializer只能在初始化时使用。
不过,您可以使用 compound literal。像
*s = (struct some_struct){.some = 5, .value = 'a'};
会完成任务的。