本文将介绍一下struct的一些使用技巧,如果要研究linux内核,对struct的用法还是有必要的。
这里参考了:http://blog.chinaunix.net/u/9577/showart_417268.html
1. struct初始化
比如这样一个struct:
struct User { int id; //id char name[100]; //user name char *home; //home directory int passwd; //password };
有三种方法,一种顺序,两种乱序:
(1) 顺序
struct User oneUser = {10, "Lucy", "/home/Lucy"};
(2) C风格乱序
struct User oneUser = { .name = "Lucy", .id = 10, .home = "/home/Lucy" };
(3) c++风格乱序
struct User oneUser = { name:"Lucy", id:10, home:"/home/Lucy" };
比如在linux2.4的内核里就使用了第三种初始化方式:
/* internal cache of cache description objs */ static kmem_cache_t cache_cache = { slabs_full: LIST_HEAD_INIT(cache_cache.slabs_full), slabs_partial: LIST_HEAD_INIT(cache_cache.slabs_partial), slabs_free: LIST_HEAD_INIT(cache_cache.slabs_free), objsize: sizeof(kmem_cache_t), flags: SLAB_NO_REAP, spinlock: SPIN_LOCK_UNLOCKED, colour_off: L1_CACHE_BYTES, name: "kmem_cache", };
不论是哪种方式,都允许只初始化部分成员;未被初始化的成员默认为0(指针类型的成员默认为NULL)。两种乱序初始化方法,即可以用在C代码中,也可以用在C++代码中。
2. struct拷贝
struct有两种拷贝方式,一是直接赋值(=),另一种是用memcpy等库函数实行内存拷贝。
(1) 直接赋值(=)
struct Temp a, b;
a = b;
(2) memcpy实行内存拷贝
struct Temp a, b; memcpy(&a, &b, sizeof(a));
不管是哪种拷贝方式,都是将以&b开始的,大小为 sizeof(struct Temp)的内存区域中的数据,简单地复制到以&a开始的,同样大小的内存区域。所以,这两种方式与按成员赋值是等价的:
a.id = b.id; a.name = b.name; a.home = b.home; a.passwd = b.passwd;
由此,我们不难看出,上面两种拷贝方式都属于浅拷贝。
原文链接: https://www.cnblogs.com/xuczhang/archive/2010/03/17/1688433.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/8910
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!