struct initialization注释不使用堆分配的存储

时间:2013-08-26 05:12:02

标签: c gcc

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

  1 #include <stdio.h>
  2 #include <stdlib.h>
  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

5 个答案:

答案 0 :(得分:3)

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

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

ptr = calloc(1, sizeof *ptr);

const struct B INIT = {
  .i = 10,
  .ch = 'c',
};

*ptr = INIT;

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

ptr = calloc(1, sizeof *ptr);

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

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

答案 1 :(得分:2)

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

这种用法称为指定初始化程序,顾名思义,它仅用于初始化结构或数组,但您要做的是分配

指定初始值设定项的正确用法:

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

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

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

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

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

答案 2 :(得分:1)

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

#include <stdio.h>
#include <stdlib.h>

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

表示法使用强制转换和初始化程序而不仅仅是初始化程序。

答案 3 :(得分: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<stdio.h>
#include<stdlib.h>


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

答案 4 :(得分:0)

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

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