C 标准库 stddef.h详解

stddef.h提供了常用类型和宏的定义,但没有声明任何函数。

这个头文件定义的类型如下。

以上三个类型都是整数类型,其中ptrdiff_t是有符号整数,size_t是无符号整数。

stddef.h定义了两个宏。

  • NULL:空指针。
  • offsetof()

offsetof()

offsetof()stddef.h定义的一个宏,用来返回某个属性在 Struct 结构内部的起始位置。由于系统为了字节对齐,可能会在 Struct 结构的属性之间插入空字节,这个宏对于确定某个属性的内存位置很有用。

它是一个带参数的宏,接受两个参数。第一个参数是 Struct 结构,第二个参数是该结构的一个属性,返回 Struct 起始位置到该属性之间的字节数。

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。

教程来源于Github,感谢大佬的无私奉献,致敬!

技术教程推荐

AI技术内参 -〔洪亮劼〕

从0开始学架构 -〔李运华〕

邱岳的产品实战 -〔邱岳〕

SQL必知必会 -〔陈旸〕

Spring Boot与Kubernetes云原生微服务实践 -〔杨波〕

雷蓓蓓的项目管理实战课 -〔雷蓓蓓〕

手机摄影 -〔@随你们去〕

程序员的个人财富课 -〔王喆〕

反爬虫兵法演绎20讲 -〔DS Hunter〕