博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[c] struct usage

Posted on 2010-03-17 18:59  xuczhang  阅读(406)  评论(0编辑  收藏  举报

本文将介绍一下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;

由此,我们不难看出,上面两种拷贝方式都属于浅拷贝。