stddef.h
定义了一些标准宏和变量,
标准宏有
NULL
这个定义大家应该都比较熟悉了,是这样子的((void *)0)
offsetof()
这个宏的定义是这样子的offsetof(TYPE, MEMBER) ((size_t)&((TYPE *)0)->MEMBER)
,主要是用来求结构体中某个成员变量在该结构体中的偏移量,这里的TYPE
就是该结构体,MEMBER
就是该成员变量,(TYPE *)0
就是说把该结构体的首地址当作0地址,那么(TYPE *)0->MEMBER
自然就是该元素的偏移量了,这里可以参考这篇文章,对offsetof
有一个很深入的讲解offsetof(s,m)解析
变量有
1.size_t
《深入理解C指针》一书中对size_t
的描述如下size_t 类型表示C 中任何对象所能达到的最大长度。它是无符号整数,因为负数在这里没有意义。它的目的是提供一种可移植的方法来声明与系统中可寻址的内存区域一致的长度。size_t 用做sizeof 操作符的返回值类型,同时也是很多函数的参数类型,包括malloc 和strlen。
在声明诸如字符数或者数组索引这样的长度变量时用size_t 是好的做法。它经常用于循环计数器、数组索引,有时候还用在指针算术运算上。
由此可见,
size_t
是为程序的可移植性提供了保障,希望大家能多多使用size_t
来代替基本数据类型
2.ptrdiff_t
这个变量通常用来表示两个指针相减后的结构,但是他表示的并不是两个指针的差值,而是两个指针在内存中的距离,《C和指针》一种有有如下描述两个指针相减的结果的类型为ptrdiff_t,它是一种有符号整数类型。减法运算的值为两个指针在内存中的距离(以数组元素的长度为单位,而非字节),因为减法运算的结果将除以数组元素类型的长度。所以该结果与数组中存储的元素的类型无关。
这个变量是个有符号的,可以是负值
3.wchar_t
这个变量主要是为国际化的字符集提供宽字符类型