C语言-标记化结构初始化

6 篇文章 0 订阅

      在查看linux内核加载elf过程中内核调用的函数过程中看到这样一段代码 (fs/exec.c源码文件)

int do_execve(const char *filename,
    const char __user *const __user *__argv,
    const char __user *const __user *__envp,
    struct pt_regs *regs)
{
    struct user_arg_ptr argv = { .ptr.native = __argv };
    struct user_arg_ptr envp = { .ptr.native = __envp };
    return do_execve_common(filename, argv, envp, regs);
}

      代码中对于机构体struct user_arg_ptr argv进行赋值的过程中. ptr.native = __argv中ptr前有个诡异的前缀点,这个用法有何作用?

 

      通过查阅资料搞明白用法,此种初始化写法并不是特殊的代码风格,而是所谓的C语言标记化结构初始化语法(designated initializer),而且还是一个ISO标准,是ISO C99的一个标准用法.该用法有何作用呢.下面举例说明:

      struct people {

             char name[128];

             int  age;

      };

     对于上面这个结构体,我们可以这么进行初始化 struct  people p = {.age = 12, .name="person"};  这样的过程就可以解决以任何的顺序初始化结构体变量成员,注意顺序不同,并可缺省.

     GCC有扩展标记化结构初始化语法,写法是下面这样的: struct people p = {name: "person", age:24};

 

测试代码

#include <stdio.h>

struct people {
    char name[128];
    int  age;
};

int main()
{
    struct people p = {.age = 12, .name = "name"};

    struct people p1 = {.age = 23, .name = "nanna", 24};
    struct people p2 = { age : 23, name : "nanna" };

    printf("people: name-%s, age-%d\n", p.name, p.age);
    printf("people1: name-%s, age-%d\n", p1.name, p1.age);
    printf("people2: name-%s, age-%d\n", p2.name, p2.age);
}

people: name-name, age-12
people1: name-nanna, age-24
people2: name-nanna, age-23

 

特别要注意p1中的初始化,在name进行初始化后,还紧跟一个24,这个数字会覆盖前面23的赋值.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值