1
0
wiki/docs/开发/C/lib 标准库/stddef.h.md

40 lines
1.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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。