[c] struct usage

本文将介绍一下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】免费获取数百本计算机经典书籍

    [c] struct usage

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/8910

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月6日 下午8:15
下一篇 2023年2月6日 下午8:15

相关推荐