在查看 Kernel相关的代码时候,经常会看到结构体中,使用点开头的变量的赋值方式,类似:
-
static inline int ip_route_connect(struct rtable **rp, u32 dst,
-
u32 src, u32 tos, int oif, u8 protocol,
-
u16 sport, u16 dport, struct sock *sk)
-
{
-
struct flowi fl = { .oif = oif,
-
.nl_u = { .ip4_u = { .daddr = dst,
-
.saddr = src,
-
.tos = tos } },
-
.proto = protocol,
-
.uli_u = { .ports =
-
{ .sport = sport,
-
.dport = dport } } };
-
-
int err;
-
...
-
}
对于类似以点开头的结构体成员变量的赋值方式,可以实现比较自由的、对特定某些变量的赋值
根据网上相关说法,该功能是 GNU的扩展
在 Linux中,可以如下来进行使用,来实现对结构体中特定变量的值进行设定:
-
struct {
-
char a[4], b;
-
}
-
gStructA[] = {[0].a[0] = 1, [0].a[2] = 3, [1].a = {10, 11}, [1].b = 22};
-
-
struct {
-
char a, b, c, d;
-
}
-
gStructB = {.a = 11, .c = 23, 32, .b = 18};
-
-
int
-
main(void)
-
{
-
char *pInt = (char *)gStructA;
-
int num = 0;
-
printf("pInt: %p, sizeof(gStructA): %d\n", pInt, sizeof(gStructA));
-
for(num = 0; num < sizeof(gStructA); num++)
-
{
-
printf("%d ", pInt[num]);
-
}
-
-
pInt = (char *)&gStructB;
-
printf("\npInt: %p, sizeof(gStructB): %d\n", pInt, sizeof(gStructB));
-
for(num = 0; num < sizeof(gStructB); num++)
-
{
-
printf("%d ", pInt[num]);
-
}
-
-
return 0;
-
}
使用gcc编译后,输出为:
-
[martin@REV]$ ./a.out
-
pInt: 0xbfa985d6, sizeof(gStructA): 10
-
1 0 3 0 0 10 11 0 0 22
-
pInt: 0xbfa985d2, sizeof(gStructB): 4
-
11 18 23 32 [martin@REV]$
-
[martin@REV]$
以上的数组元素初始化中,除使用了带“."的方式外,其他的和正常的数组初始化是一样的:
实现了对于有数组的结构体变量的初始化赋值,对于未进行显式初始化的数组元素,默认初始化为0
--------------------------REF------------------------------
http://blog.chinaunix.net/uid-21317725-id-1828031.html
阅读(1953) | 评论(0) | 转发(0) |