任何方式来初始化动态分配的结构?

问题描述:

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); 

http://ideone.com/zZxTc4

但是,它似乎不工作的时候该结构具有动态分配:

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'}; 
    ^

http://ideone.com/nBiorw

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'}; 
     ^~~~~~ 

http://ideone.com/SpBX1E

是否有任何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); 

http://ideone.com/1XAiQS

因为(a)它意味着该结构的每个成员都占有自己的路线,因为人们往往当他们看到不是一个;标志其行的源代码的最后标志皱眉哪个稍微不便是,和(b)我不能像在正常的结构体初始化中那样依赖初始化为0的未指定的值。

在你的代码

*s = {.some = 5, .value = 'a'}; 

initialization,这是一个assignment

Brace enclosed initializer只能在初始化期间使用。

您可以使用compound literal,虽然。像

*s = (struct some_struct){.some = 5, .value = 'a'}; 

将完成这项工作。

+0

限定“initialiser”struct#“const”,否则根据编译器优化程度的不同,最终可能会有两个副本。尽管它是名称,但是_compound literal_不是一个常量。 – Olaf

+0

只要补充一点,这仍然不是初始化,而是一项任务。 –

+0

@AjayBrahmakshatriya对,我们正在努力使作业在那里工作。 :) –