存档

2015年12月 的存档

c中出现的offsetof宏和container_of宏 解析

2015年12月27日 753 人阅读 没有评论
1、offsetof宏用于求成员变量在结构体中的偏移量
#define offsetof(TYPE,MEMBER) ((size_t)&((TYPE*)0)->MEMBER)
我们来逐步分解这个宏:
((TYPE*)0) 把地址值为0指针转换为TYPE指针
((TYPE*)0)->MEMBER 解指针应用,求起始地址为0的类型为TYPE的成员MEMBER
&((TYPE*)0)->MEMBER 求起始地址为0的类型为TYPE的成员MEMBER的地址
((size_t)&((TYPE*)0)->MEMBER) 把起始地址为0的类型为TYPE的成员MEMBER的地址值类型转换为size_t类型
综上我们可以看到一个很巧妙的地方,就是把值为0的地址转换为TYPE*指针,这样求得的MEMBER的地址就是成员MEMBER在TYPE中的偏移量。

阅读全文…

分类: c/c++, linux 标签:

linux c 堆变量,栈变量,指针参数,非指针参数剖析

2015年12月7日 818 人阅读 没有评论

1、概念

2.1 堆:程序可以动态申请的存储空间,通过malloc系列函数分配,全局可访问。

2.2 栈:程序在进行函数调用时动态伸缩的存储空间,局限于函数内可以访问。

2.3 堆变量:数据存储在堆的变量,全局可访问。

2.4 栈变量:函数中声明的局部变量,只能在函数内部访问,否则访问行为的结果是未定义的。

阅读全文…

分类: c/c++, 面试 标签:

c/c++中的“大小,长度”问题

2015年12月6日 570 人阅读 没有评论

1、显式缓冲区的sizeof和strlen

char buf[10] = “hello”;

size_t a = sizeof(buf);

size_t b = strlen(buf);

a的值为10,b的值为5,这是因为sizeof(buf)计算的是字符数组的大小,strlen(buf)计算的是“hello”的长度。
2、隐式缓冲区的sizeof和strlen

阅读全文…

分类: c/c++, 随想, 面试 标签: