使用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
答案 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个字节。