- 浏览: 44765 次
- 来自: 杭州
文章分类
最新评论
在查看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的赋值.
发表评论
-
fedora系统删除多余内核
2013-01-22 21:32 1764查看本地系统安装的内核版本: $rpm -q ... -
Ubuntu change GNOME to XFCE problem
2012-12-14 16:10 853I'm now experiencing this probl ... -
c库中snprintf返回值误区
2012-11-07 22:05 7478最近看开源代码中发现一个问题,下面是发表在内核开 ... -
C++著名类库
2012-11-03 20:00 799转自 http://www.open-open ... -
Signal信号
2012-10-07 12:55 01) SIGHUP 本信号在用户终端连接(正常或非正常)结 ... -
Nginx
2012-09-20 23:38 0nginx (pronounced "engine ... -
Linux 灾难恢复
2012-09-19 21:57 0简介: Linux 发行版本 ... -
close_on_exec标志位
2012-09-06 21:33 2591close_on_exec是一个进程所有文件描述 ... -
Linux进程地址空间的探究解析
2012-08-08 23:35 0我们知道,在32位机器上 linux操作系统中的进程的地址空 ... -
git使用
2012-08-08 23:23 0我认为每个学过Git的人都应该做过类似这种笔记,因为Git命令 ... -
select, poll和epoll的区别
2012-07-31 21:34 0随着2.6内核对epoll的完全支持,网络上很多的文章和 ... -
linux多线程编程
2012-07-28 23:09 0本篇总结POSIX线程。可以用多个线程在单进程环境中执行多个任 ... -
select 和 epoll区别
2012-07-27 23:16 0最近有朋友在面试的时候被问了select 和epoll效率差的 ... -
echo显示变色
2012-07-24 17:07 0先来熟悉一下echo,如下: 名称 ... -
换行符的使用
2012-07-24 14:07 0Have you ever opened a s ... -
How to create and apply a patch with Git
2012-07-24 13:55 0Git is quite common now ... -
Facebook Folly源代码分析
2012-07-23 21:33 0Folly 是 Facebook 的一个开源C++11组件库, ... -
浅谈GCC预编译头技术
2012-07-23 09:51 922——谨以此文,悼念我 ... -
MySQL索引背后的数据结构及算法原理
2012-07-21 22:37 0转自 http://blog.jobbole.com/2400 ... -
patch文件的制作与使用
2012-07-01 18:43 2192创建补丁文件: 比如一个工程目录为project-o ...
相关推荐
它可以同时进行循环变量的初始化、条件检查和迭代操作,因此在很多情况下都是首选的循环结构。`for`循环非常适合处理已知循环次数的任务。 - **循环嵌套和循环结构的综合应用** 在复杂的应用程序中,循环嵌套(即...
1. 初始化迷宫:读取迷宫配置,创建二维数组。 2. 定义队列结构:自定义队列数据结构,包括入队、出队等操作。 3. 广度优先搜索函数:实现BFS算法,包括节点的添加、删除和路径更新。 4. 控制台输出函数:根据搜索...
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,...
这些函数可能包括初始化游戏面板、设置雷区、生成随机雷的位置、检查相邻方格是否有雷、标记方格、以及游戏逻辑判断等功能。例如,可能会有一个`init_board`函数用于创建一个二维数组来表示游戏板,并初始化雷的位置...
值得注意的是,如果初始化列表中的字符数量少于数组长度,未赋值的元素会被自动初始化为NULL字符(`\0`),这在C语言中用于标记字符串的结束。 **字符串初始化**:除了逐个字符初始化,还可以使用字符串常量来初始...
以下为部分源代码示例,展示了哈夫曼树的初始化、权重输入以及编码实现的过程: ```c #include #include #include #define MAXLEN 100 typedef struct { int weight; // 权重 int lchild; // 左孩子索引 ...
在提供的代码中,定义了一个`Queue`结构体,包括头节点和尾节点指针,以及相应的操作函数如`QueueInit`(初始化队列)、`QueuePush`(入队)、`QueuePop`(出队)、`QueueFront`(获取队首元素)、`QueueBack`(获取...
`init()`函数初始化邻接矩阵,所有元素初始化为0。`LocateVex()`函数用于查找并返回给定顶点在顶点表中的位置。`CreateDG()`函数则用于创建有向图,根据用户输入的顶点和边来填充邻接矩阵。 `DepthFirstSearchDG()`...
2. **函数声明**:在 `#include "game.h"` 之后,程序会导入头文件中声明的函数,如初始化棋盘、检查游戏状态(是否有获胜者或平局)、打印棋盘等。 3. **主循环**:游戏的核心是一个主循环,允许两个玩家交替进行...
`for`循环是C语言中最常用的循环结构之一,它在一行内包含了初始化、条件检查和更新三个部分。基本形式如下: ```c for (初始化; 条件; 更新) { // 循环体 } ``` `for`循环在每次迭代前都会检查条件,如果条件为真...
初始化迷宫数组如下: ```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,...
2. **主函数**:程序的入口点,初始化迷宫和起始位置,然后调用回溯算法的递归函数。 3. **回溯函数**:这是算法的核心部分,它会尝试在迷宫中移动。函数接受当前位置和可能的方向作为参数。每次函数被调用时,都会...
初始化时,所有元素都为0,表示游戏盘面为空。 接下来,我们需要编写函数来处理游戏流程。首先是`drawBoard()`函数,它会打印当前的游戏状态,让玩家可以直观地看到盘面。使用循环和条件语句,我们可以逐行逐列地...
它初始化一个距离矩阵,然后对所有可能的中间节点进行迭代,如果通过中间节点能缩短路径,就更新矩阵中的距离。 6. **课程报告**:这份报告很可能会包括算法的理论介绍、伪代码、C语言实现代码以及实验结果分析。...
初始化表时,会确保表的大小至少为`MinTableSize`,并使用`NextPrime`函数找到大于等于给定大小的最小素数,以减少模运算带来的冲突。`NextPrime`函数遍历偶数以上的所有偶数,检查是否为素数,直到找到符合条件的...
同时,花括号可以用于定义复合语句或函数体,但也可以用在其他语境中,如初始化数组等。 7. 函数调用及参数:第6.16题提到了函数调用中的参数处理,C语言允许函数返回void类型,意味着该函数不返回值。`&`是地址...
- 初始化迷宫数据结构,可以使用二维数组表示。 - 定义一个栈结构,并实现入栈(push)和出栈(pop)操作。 - 设定起点和终点,开始搜索过程。 - 使用DFS或BFS策略,每次从栈顶取出节点,检查其相邻节点并标记已...
- 初始化、条件判断、更新三个部分组成。 - **6.6 循环的嵌套** - 在一个循环体内包含另一个循环体。 - **6.7 几种循环的比较** - while、do-while、for的差异。 - **6.8 break和continue语句** - **6.8.1 ...
这个问题的核心在于如何用程序来模拟这一过程,这就需要用到C语言的基本结构。 在C语言中,我们通常会用一个整型数组来表示这些猴子,数组的长度为n,每个元素代表一个猴子的编号。然后,定义两个变量,一个用于...