struct intitialization表示法不使用堆分配存储

使用gcc(GCC)4.4.6,我尝试编译这个程序 –

1 #include  2 #include  3 4 int main(int argc, char *argv[]) 5 { 6 7 struct B { 8 int i; 9 char ch; 10 }; 11 12 struct B *ptr; 13 14 ptr = (struct B*) calloc(1, sizeof(struct B)); 15 16 *ptr = { 17 .i = 10, 18 .ch = 'c', 19 }; 20 21 printf("%d,%c\n", ptr->i, ptr->ch); 22 23 return 0; 24 } 25 $ make gcc -g -Wall -o test test.c test.c: In function 'main': test.c:16: error: expected expression before '{' token make: *** [test] Error 1 

 *ptr = { .i = 10, .ch = 'c', }; 

这个用法被称为指定的初始化程序 ,顾名思义,它只用于初始化 struct或数组,但你要做的是分配

正确使用指定的初始化程序:

 strcut B foo = {.i = 10, .ch = 'c'}; 

要分配结构,您仍然需要使用:

  ptr->i = 10; ptr->ch = 'c'; 

编辑 :或者您可以像@Andrey T的回答一样使用复合文字:

 *ptr = (struct B) { .i = 10, .ch = 'c', }; 

您正在讨论的“结构初始化表示法”使用术语“初始化”是有原因的:它旨在用于初始化上下文中。 你要做的不是初始化。 这是作业。 此语法不会立即在赋值上下文中起作用。

为了仍然使用这种方便的语法,您必须创建另一个相同类型的结构,使用此语法对其进行初始化,然后使用赋值将该结构复制到结构中。 例如

 ptr = calloc(1, sizeof *ptr); const struct B INIT = { .i = 10, .ch = 'c', }; *ptr = INIT; 

这已经实现了你想要做的事情,但你可以通过使用C语言的复合文字function使上述更紧凑

 ptr = calloc(1, sizeof *ptr); *ptr = (struct B) { .i = 10, .ch = 'c', }; 

基本上,后一个代码示例可能就是您正在寻找的。 但是,请注意,从概念上讲,这仍然不是初始化 。 它是一个赋值,它创建一个struct B类型的临时对象,然后将它分配给你的*ptr对象。

如果要初始化(分配值)动态分配的结构,则需要在赋值的RHS上使用C99复合文字:

 #include  #include  int main(void) { struct B { int i; char ch; }; struct B *ptr = (struct B*) calloc(1, sizeof(struct B)); *ptr = (struct B){ .i = 10, .ch = 'c', }; printf("%d,%c\n", ptr->i, ptr->ch); return 0; } 

符号使用强制转换和初始化程序而不仅仅是初始化程序。

在结构初始值设定项中,指定要使用’初始化的字段的名称。 fieldname =’在元素值之前。 例如,给定以下结构,

struct point {int x,y; };

以下初始化

struct point p = {。y = value1,.x = value2};

相当于

struct point p = {value1,value2};

另一种具有相同含义的语法’fieldname:’,如下所示:

struct point p = {y:value2,x:value1};

‘[ index ]’或’。 fieldname ‘被称为指示符。 下面的代码将起作用。 对于指针YU Hao告诉..

 #include #include int main(int argc, char *argv[]) { struct B { int i; char ch; } ; struct B name = { .i = 10, .ch = 'c', }; printf("%d,%c\n", name.i, name.ch); return 0; } 
 *ptr = { .i = 10, .ch = 'c', }; 

此用法称为指定初始化程序,仅在初始化时用于分配。 据我所知,它不是指针,因为只为任何指针分配了4个字节。