`

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

 
阅读更多

      在查看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的赋值.

分享到:
评论

相关推荐

    C语言-第6章 循环结构

    它可以同时进行循环变量的初始化、条件检查和迭代操作,因此在很多情况下都是首选的循环结构。`for`循环非常适合处理已知循环次数的任务。 - **循环嵌套和循环结构的综合应用** 在复杂的应用程序中,循环嵌套(即...

    c语言-广度优先-迷宫寻路-程序+源代码

    1. 初始化迷宫:读取迷宫配置,创建二维数组。 2. 定义队列结构:自定义队列数据结构,包括入队、出队等操作。 3. 广度优先搜索函数:实现BFS算法,包括节点的添加、删除和路径更新。 4. 控制台输出函数:根据搜索...

    C语言---扑克牌跑得快程序

    2. **扑克牌数组初始化**:通过数组 `a[52]` 初始化一副扑克牌(不包括大小王)。 ```c int a[52]={ 101,102,103,104,105,106,107,108,109,110,111,112,113, 201,202,203,204,205,206,207,208,209,210,211,212,...

    C语言-扫雷游戏C语言源代码

    这些函数可能包括初始化游戏面板、设置雷区、生成随机雷的位置、检查相邻方格是否有雷、标记方格、以及游戏逻辑判断等功能。例如,可能会有一个`init_board`函数用于创建一个二维数组来表示游戏板,并初始化雷的位置...

    C语言字符数组初始化

    值得注意的是,如果初始化列表中的字符数量少于数组长度,未赋值的元素会被自动初始化为NULL字符(`\0`),这在C语言中用于标记字符串的结束。 **字符串初始化**:除了逐个字符初始化,还可以使用字符串常量来初始...

    C语言-哈夫曼编码实验报告

    以下为部分源代码示例,展示了哈夫曼树的初始化、权重输入以及编码实现的过程: ```c #include #include #include #define MAXLEN 100 typedef struct { int weight; // 权重 int lchild; // 左孩子索引 ...

    数据结构-c语言-带main函数-图7.3-图的遍历-广度优先搜索-队列-邻接表-无向图。

    在提供的代码中,定义了一个`Queue`结构体,包括头节点和尾节点指针,以及相应的操作函数如`QueueInit`(初始化队列)、`QueuePush`(入队)、`QueuePop`(出队)、`QueueFront`(获取队首元素)、`QueueBack`(获取...

    数据结构-c语言-带main函数-图7.3-图的遍历-深度优先搜索-递归方法-邻接矩阵-有向图。

    `init()`函数初始化邻接矩阵,所有元素初始化为0。`LocateVex()`函数用于查找并返回给定顶点在顶点表中的位置。`CreateDG()`函数则用于创建有向图,根据用户输入的顶点和边来填充邻接矩阵。 `DepthFirstSearchDG()`...

    C语言-三子棋游戏,三子棋游戏C语言代码,内含详细注释,全是干货

    2. **函数声明**:在 `#include "game.h"` 之后,程序会导入头文件中声明的函数,如初始化棋盘、检查游戏状态(是否有获胜者或平局)、打印棋盘等。 3. **主循环**:游戏的核心是一个主循环,允许两个玩家交替进行...

    谢丽聪老师C语言-6循环控制ppt课件.ppt

    `for`循环是C语言中最常用的循环结构之一,它在一行内包含了初始化、条件检查和更新三个部分。基本形式如下: ```c for (初始化; 条件; 更新) { // 循环体 } ``` `for`循环在每次迭代前都会检查条件,如果条件为真...

    求解迷宫问题-(c语言-很详细哦).doc

    初始化迷宫数组如下: ```c int mg[11][11]={ {1,1,1,1,1,1,1,1,1,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,0,0,1,1,0,0,1}, {1,0,1,1,1,0,0,0,0,1}, {1,0,0,0,1,0,0,0,0,1}, {1,0,1,0,0,...

    C语言 - 回溯算法解迷宫文体【源码+分析文档】

    2. **主函数**:程序的入口点,初始化迷宫和起始位置,然后调用回溯算法的递归函数。 3. **回溯函数**:这是算法的核心部分,它会尝试在迷宫中移动。函数接受当前位置和可能的方向作为参数。每次函数被调用时,都会...

    c语言 tic-tac-toe

    初始化时,所有元素都为0,表示游戏盘面为空。 接下来,我们需要编写函数来处理游戏流程。首先是`drawBoard()`函数,它会打印当前的游戏状态,让玩家可以直观地看到盘面。使用循环和条件语句,我们可以逐行逐列地...

    c语言算法与数据结构最短路径报告+代码.zip

    它初始化一个距离矩阵,然后对所有可能的中间节点进行迭代,如果通过中间节点能缩短路径,就更新矩阵中的距离。 6. **课程报告**:这份报告很可能会包括算法的理论介绍、伪代码、C语言实现代码以及实验结果分析。...

    数据结构实验C语言实现散列表-构造-解决冲突-查找.pdf

    初始化表时,会确保表的大小至少为`MinTableSize`,并使用`NextPrime`函数找到大于等于给定大小的最小素数,以减少模运算带来的冲突。`NextPrime`函数遍历偶数以上的所有偶数,检查是否为素数,直到找到符合条件的...

    嵌入式系统开发人员C语言测试题-程序结构.doc

    同时,花括号可以用于定义复合语句或函数体,但也可以用在其他语境中,如初始化数组等。 7. 函数调用及参数:第6.16题提到了函数调用中的参数处理,C语言允许函数返回void类型,意味着该函数不返回值。`&`是地址...

    C语言数据结构 迷宫算法

    - 初始化迷宫数据结构,可以使用二维数组表示。 - 定义一个栈结构,并实现入栈(push)和出栈(pop)操作。 - 设定起点和终点,开始搜索过程。 - 使用DFS或BFS策略,每次从栈顶取出节点,检查其相邻节点并标记已...

    谭浩强c语言程序设计

    - 初始化、条件判断、更新三个部分组成。 - **6.6 循环的嵌套** - 在一个循环体内包含另一个循环体。 - **6.7 几种循环的比较** - while、do-while、for的差异。 - **6.8 break和continue语句** - **6.8.1 ...

    C语言经典例子--数猴子

    这个问题的核心在于如何用程序来模拟这一过程,这就需要用到C语言的基本结构。 在C语言中,我们通常会用一个整型数组来表示这些猴子,数组的长度为n,每个元素代表一个猴子的编号。然后,定义两个变量,一个用于...

Global site tag (gtag.js) - Google Analytics