40 lines
1.5 KiB
Markdown
40 lines
1.5 KiB
Markdown
|
# stddef.h
|
|||
|
|
|||
|
`stddef.h`提供了常用类型和宏的定义,但没有声明任何函数。
|
|||
|
|
|||
|
这个头文件定义的类型如下。
|
|||
|
|
|||
|
- ptrdiff_t:指针相减运算时,返回结果的数据类型。
|
|||
|
- size_t:`sizeof`运算符返回的类型。
|
|||
|
- wchar_t:一种足够大、能容纳各种字符的类型。
|
|||
|
|
|||
|
以上三个类型都是整数类型,其中`ptrdiff_t`是有符号整数,`size_t`是无符号整数。
|
|||
|
|
|||
|
`stddef.h`定义了两个宏。
|
|||
|
|
|||
|
- NULL:空指针。
|
|||
|
- offsetof()
|
|||
|
|
|||
|
## offsetof()
|
|||
|
|
|||
|
`offsetof()`是`stddef.h`定义的一个宏,用来返回某个属性在 Struct 结构内部的起始位置。由于系统为了字节对齐,可能会在 Struct 结构的属性之间插入空字节,这个宏对于确定某个属性的内存位置很有用。
|
|||
|
|
|||
|
它是一个带参数的宏,接受两个参数。第一个参数是 Struct 结构,第二个参数是该结构的一个属性,返回 Struct 起始位置到该属性之间的字节数。
|
|||
|
|
|||
|
```c
|
|||
|
struct s {
|
|||
|
char a;
|
|||
|
int b[2];
|
|||
|
float c;
|
|||
|
};
|
|||
|
|
|||
|
printf("%zu\n", offsetof(struct s, a)); // 0
|
|||
|
printf("%zu\n", offsetof(struct s, b)); // 4
|
|||
|
printf("%zu\n", offsetof(struct s, c)); // 12
|
|||
|
```
|
|||
|
|
|||
|
对于上面这个 Struct 结构,`offsetof(struct s, a)`一定等于`0`,因为`a`属性是第一个属性,与 Struct 结构自身的地址相同。
|
|||
|
|
|||
|
系统为了字节对齐,在`a`属性后面分配了3个空字节,导致`b`属性存储在第4个字节,所以`offsetof(struct s, b)`和`offsetof(struct s, c)`分别是4和12。
|
|||
|
|