<stddef.h> 是 C 标准库中的一个头文件,提供了对常用类型和宏的定义,尤其是用于内存操作和指针算术运算。它包含一些与内存管理和指针相关的常用工具,比如 size_tptrdiff_tNULL


📖 目录

  1. <stddef.h> 简介
  2. 常见类型
  3. 常用宏
  4. 示例代码
  5. 参考资料

1️⃣ <stddef.h> 简介

<stddef.h> 提供了几个标准的类型、宏和常量,它们主要用于指针运算、内存操作和一些常用的数据类型定义。它是一个轻量级的头文件,通常与其他库一起使用,如 <stdlib.h><stdio.h>


2️⃣ 常见类型

📌 size_t

size_t 是一个无符号整数类型,通常用于表示内存块的大小或数组索引。它的大小足够容纳目标平台上最大的对象大小。

  • 用途:用于表示内存的大小、数组的索引等。
  • 定义size_t 的定义依赖于平台,但通常它是一个无符号整数类型(如 unsigned intunsigned long)。

📌 ptrdiff_t

ptrdiff_t 是一个有符号整数类型,用于表示两个指针之间的差值。它常用于指针算术运算,计算指针偏移量。

  • 用途:表示指针之间的差异,用于指针运算结果。
  • 定义ptrdiff_t 是有符号整数类型。

📌 NULL

NULL 是一个宏,表示空指针常量。它通常用于初始化指针,表示该指针不指向有效的内存地址。

  • 用途:初始化空指针或判断指针是否为空。
  • 定义:通常定义为 (void*)0,在不同的平台中可能有所不同。

3️⃣ 常用宏

📌 offsetof

offsetof 宏用于获取结构体成员相对于结构体起始位置的字节偏移量。

原型:

size_t offsetof(type, member);

  • 参数
    • type:结构体类型。
    • member:结构体成员名。
  • 返回值:返回 member 相对于结构体 type 开头的字节偏移量。

示例

#include <stddef.h>
#include <stdio.h>

struct MyStruct {
    int a;
    double b;
};

int main() {
    printf("Offset of 'b' in MyStruct: %zu\n", offsetof(struct MyStruct, b));
    return 0;
}

输出

Offset of 'b' in MyStruct: 8


4️⃣ 示例代码

📌 示例:size_tNULL 的使用

该示例展示了如何使用 size_tNULL

#include <stddef.h>
#include <stdio.h>

int main() {
    size_t length = 10;  // 使用 size_t 来表示长度
    int* ptr = NULL;     // 初始化指针为 NULL

    if (ptr == NULL) {
        printf("Pointer is NULL\n");
    }

    printf("Length: %zu\n", length);  // 打印 size_t 类型的长度

    return 0;
}

输出

Pointer is NULL
Length: 10

解释

  1. size_t length 用于表示一个无符号的大小,通常用于表示内存大小或数组的长度。
  2. int* ptr = NULL 用于初始化空指针。通过 NULL 判断指针是否为空。

5️⃣ 参考资料

📖 C 标准库官方文档 – stddef.h
📖 GNU C Library – stddef.h
📖 ISO C 标准(PDF)


📌 总结

<stddef.h> 提供了几种常用类型和宏,主要用于内存操作和指针运算。它定义了 size_tptrdiff_tNULL 等常用工具,在很多场景下都非常有用。了解并熟悉这些类型和宏对于进行内存管理、指针算术操作和处理结构体成员偏移等任务非常重要。