有什么方法可以初始化动态分配的结构?

1 c struct initialization compound-literals

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);
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

此代码产生:

error: expected expression before ‘{’ token
  *s = {.some = 5, .value = 'a'};
       ^
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

这段代码产生:

error: expected expression before ‘struct’
  *s = struct some_struct {.some = 5, .value = 'a'};
       ^~~~~~
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

http://ideone.com/1XAiQS

这稍微有点不方便,因为(a)这意味着结构的每个成员都必须占据自己的行,因为当人们看到一个;符号不是源代码中该行的最后一个符号时,他们往往会皱眉,并且(b)我'不能0像正常结构初始化那样依赖未指定的值被初始化。

Sou*_*osh 5

在你的代码中

 *s = {.some = 5, .value = 'a'};
Run Code Online (Sandbox Code Playgroud)

不是一个初始化,这是一个任务

大括号封闭的初始化程序只能在初始化期间使用。

不过,您可以使用复合文字。就像是

*s = (struct some_struct){.some = 5, .value = 'a'};
Run Code Online (Sandbox Code Playgroud)

会做的工作。