任何方式来初始化动态分配的结构?
问题描述:
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,这是一个assignment。
Brace enclosed initializer只能在初始化期间使用。
您可以使用compound literal,虽然。像
*s = (struct some_struct){.some = 5, .value = 'a'};
将完成这项工作。
限定“initialiser”struct#“const”,否则根据编译器优化程度的不同,最终可能会有两个副本。尽管它是名称,但是_compound literal_不是一个常量。 – Olaf
只要补充一点,这仍然不是初始化,而是一项任务。 –
@AjayBrahmakshatriya对,我们正在努力使作业在那里工作。 :) –