注册 登录  
 加关注

网易博客网站关停、迁移的公告:

将从2018年11月30日00:00起正式停止网易博客运营
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

ideality

@linux c 编程@

 
 
 

日志

 
 
关于我

喜欢开源,愿意结识青岛使用开源的朋友,一起学习,工作。

网易考拉推荐
 
 

linux kernel 结构体赋值方法{转载}  

2013-10-10 18:21:38|  分类: netfilter |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

http://www.chineselinuxuniversity.net/articles/48226.shtml

这几天看Linux的内核源码,突然看到init_pid_ns这个结构体变量的赋值特别奇怪。 view plainprint? struct pid_namespace init_pid_ns = {     .kref = {         .refcount       = ATOMIC_INIT(2),     },     .pidmap = {         [ 0 ... PIDMAP_ENTRIES-1] = { ATOMIC_INIT(BITS_PER_PAGE), NULL }     },     .last_pid = 0,     .level = 0,     .child_reaper = &init_task, }; 请注意上面代码的.pidmap这个结构体数组的赋值形式。 view plainprint? [ 0 ... PIDMAP_ENTRIES-1] 直接拿索引来赋值,而且直接写出了索引的范围。有点python的味道。

只是记得C语言的函数的可变参数是用的...的方式。没想过结构体也有这种操作方式。

比较感兴趣,自己写了一小段类似的代码。 

 

复制代码
 1 #include <stdio.h>
 2 
 3 struct pid{   
 4 
 5   int val;   
 6 
 7   void *fn; 
 8 
 9 };
10 
11 struct str{  
12 
13    int val;    
14 
15  struct pid id[10]; 
16 
17 };
18 
19 struct str init_str = { 
20 
21     .val = 1,  
22 
23    .id = {         [ 0 ... 9] = {2, NULL}     }, 
24 
25 };
26 
27 int main(void){     int i;
28 
29     for(i = 0; i < 10; i++)         printf("init_str.id[%d].val =  %d\n", i, init_str.id[i].val);
30 
31     return 0; 
32 
33 }
复制代码

 

 

编译后测试。结果的确是这样。

如果要对结构体数组进行操作,这种方式可以试试。

 

 

下面的代码是自己写的测试代码:

 

复制代码
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <stdbool.h>
 4 //use the linux kernel struct init method
 5 // Write by sndnvaps<sndnvaps@gmail.com>
 6 //struct stu {
 7 // int age;
 8 // float tall;
 9 // char Address[256];
10 // char CellPhone_num[30];
11 // char sex[5];
12 // };
13 // 
14 // *****************
15 // init the struct 
16 // ****************
17 // struct stu stu_one = {
18 // .age = 18,
19 // .tall = 175.6,
20 // .Address = "GuangZhou,GuangDong,China",
21 // .CellPhone_num = "189xxxxxxxx",
22 // .sex = "male",
23 // };
24 struct stu_info{
25     int age;
26     float tall;
27     char Address[256];
28     char CellPhone_num[30];
29     char sex[10];
30 };
31 
32 struct stu_info stu = {
33         .age = 17,
34         .tall = 175.6,
35         .Address = "GuangZhou, GuangDong, China",
36         .CellPhone_num = "189xxxxxxxx",
37         .sex = "male",
38     };
39 
40 
41 bool check_age(struct stu_info *stu) {
42     if (stu->age >= 18) {
43         return true;
44     }
45     return false;
46 }
47 
48 int main(int argc, char *argv[]) {
49     bool is_eightheen = false;
50     is_eightheen = check_age(&stu);
51     printf("infomation of stu one ....\n");
52     printf("Age = %d\n", stu.age);
53     printf("Tall = %f\n", stu.tall);
54     printf("Address = %s\n", stu.Address);
55     if (is_eightheen) {
56 
57     printf("Cellphone number = %s\n", stu.CellPhone_num);
58     } else {
59         printf("this male under 18, not show the cellphone number..\n");
60     }
61 
62     printf("Sex = %s\n", stu.sex);
63     return 0;
64 }
  评论这张
 
阅读(880)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018