C stdlib.h标准库

C语言 stdlib.h 标准库详解

C语言 标准库

编程小白也能理解的详细知识点汇总

是C语言中最重要且最常用的标准库之一,包含内存管理、随机数生成、字符串转换、程序控制等核心功能。 本文将以通俗易懂的方式解释该库的主要函数和使用方法,帮助编程新手快速掌握这些关键知识点。

内存管理函数
malloc
void* malloc(size_t size);

大白话解释: 向操作系统申请一块指定大小的内存空间。

详细说明: malloc 是 memory allocation(内存分配)的缩写。它会在堆内存中分配一块连续的内存区域,并返回指向该内存区域起始地址的指针。如果分配失败,则返回 NULL。

💡 重要提示:使用 malloc 分配的内存不会初始化,里面的值是随机的垃圾数据。使用前务必初始化或清零。

calloc
void* calloc(size_t num, size_t size);

大白话解释: 申请一块内存,并自动初始化为0。

详细说明: calloc 是 contiguous allocation(连续分配)的缩写。它分配 num 个大小为 size 字节的连续内存空间。与 malloc 不同,calloc 会将分配的内存全部初始化为0。

realloc
void* realloc(void* ptr, size_t size);

大白话解释: 调整已分配内存块的大小。

详细说明: realloc 是 re-allocation(重新分配)的缩写。它用于调整先前分配的内存块的大小。可以增大或缩小内存块。如果扩大内存,新增部分的内容是未初始化的。

free
void free(void* ptr);

大白话解释: 归还之前申请的内存。

详细说明: 将之前通过 malloc、calloc 或 realloc 分配的内存归还给系统。调用 free 后,指针变为悬空指针,应避免再次使用。

⚠️ 警告:一定要为每个 malloc、calloc、realloc 调用对应的 free 函数,否则会造成内存泄漏!

字符串转换函数
atoi, atol, atoll
int atoi(const char* str);
long atol(const char* str);
long long atoll(const char* str);

大白话解释: 把字符串转换成整数。

详细说明: 这些函数将字符串转换为整数类型(int、long、long long)。它们会跳过前面的空白字符,从第一个数字或正负号开始转换,遇到非数字字符时停止。

#include <stdio.h>
#include <stdlib.h>

int main() {
    char str[] = “12345”;
    int num = atoi(str);
    printf(“转换结果: %d”, num); // 输出: 12345
    return 0;
}
atof
double atof(const char* str);

大白话解释: 把字符串转换成浮点数。

详细说明: 将字符串转换为双精度浮点数(double)。同样会跳过前面的空白字符,转换直到遇到非浮点数字符为止。

strtol, strtoll, strtoul
long int strtol(const char* str, char** endptr, int base);
unsigned long int strtoul(const char* str, char** endptr, int base);

大白话解释: 更强大的字符串转数字函数。

详细说明: 这些函数功能更强大,可以指定进制(如二进制、八进制、十进制、十六进制),并提供错误检测功能。endptr 参数指向转换结束后剩余字符串的位置。

strtod
double strtod(const char* str, char** endptr);

大白话解释: 更强大的字符串转浮点数函数。

详细说明: 将字符串转换为双精度浮点数,提供更精确的控制和错误检测。endptr 参数指向转换结束后剩余字符串的位置。

随机数生成函数
rand
int rand(void);

大白话解释: 生成一个伪随机数。

详细说明: 返回一个范围在 0 到 RAND_MAX(通常是 32767)之间的伪随机整数。所谓的”伪随机”是因为这些数字实际上是通过算法生成的,并不是真正的随机数。

srand
void srand(unsigned int seed);

大白话解释: 设置随机数生成器的种子。

详细说明: 通过设置不同的种子值,可以使 rand 函数产生不同的随机数序列。通常使用当前时间作为种子值,确保每次运行程序时生成不同的随机序列。

#include <stdio.h>
#include <stdlib.h>
#include <time.h> // 包含 time 函数

int main() {
    srand(time(0)); // 用当前时间设置种子
    for(int i=0; i<5; i++) {
        printf(“%d “, rand()); // 生成随机数
    }
    return 0;
}

💡 提示:不调用 srand 直接使用 rand,每次程序运行都会得到相同的随机数序列。

程序控制与退出函数
exit
void exit(int status);

大白话解释: 正常终止程序运行。

详细说明: 终止程序运行,关闭所有打开的文件,并向操作系统返回状态码。通常,0 表示成功终止,非零值表示异常终止。

if (error) {
    printf(“发生严重错误!”);
    exit(1); // 错误退出
}
abort
void abort(void);

大白话解释: 立即异常终止程序。

详细说明: 导致程序异常终止,通常会产生一个核心转储文件(core dump)。它不会调用任何注册的退出处理函数,也不执行文件缓冲区的刷新。

atexit
int atexit(void (*func)(void));

大白话解释: 注册程序结束时执行的函数。

详细说明: 注册一个函数,在程序正常终止(通过 exit 或 main 函数返回)时被调用。可以注册多个函数,它们按注册的相反顺序执行。

void cleanup1() { printf(“清理资源1\n”); }
void cleanup2() { printf(“清理资源2\n”); }

int main() {
    atexit(cleanup2);
    atexit(cleanup1);
    printf(“主函数运行中…\n”);
    return 0;
}
// 输出:
// 主函数运行中…
// 清理资源1
// 清理资源2
system
int system(const char* command);

大白话解释: 执行系统命令。

详细说明: 将 command 字符串传递给操作系统的命令行解释器执行。例如在 Windows 上可以执行 “dir” 命令,在 Linux 上可以执行 “ls”。

#include <stdlib.h>

int main() {
    system(“echo 你好,世界!”); // 执行echo命令
    return 0;
}
搜索与排序函数
bsearch
void* bsearch(const void* key, const void* base,
size_t num, size_t size,
int (*compar)(const void*, const void*));

大白话解释: 在有序数组中二分查找。

详细说明: 使用二分查找算法在已排序的数组中查找指定元素。如果找到,则返回指向该元素的指针;否则返回 NULL。

📌 注意:数组必须已经按照比较函数的规则排序!

qsort
void qsort(void* base, size_t num, size_t size,
int (*compar)(const void*, const void*));

大白话解释: 快速排序算法。

详细说明: 对数组进行快速排序。需要提供一个比较函数,该函数决定数组中任意两个元素的排序顺序。

// 比较整数函数
int compareInt(const void* a, const void* b) {
    int arg1 = *(const int*)a;
    int arg2 = *(const int*)b;
    return (arg1 > arg2) – (arg1 < arg2);
}

int main() {
    int arr[] = {5, 2, 8, 1, 4};
    int n = sizeof(arr)/sizeof(arr[0]);
    qsort(arr, n, sizeof(int), compareInt);
    // 现在 arr = {1, 2, 4, 5, 8}
    return 0;
}
其他实用函数
abs, labs, llabs
int abs(int n);
long labs(long n);
long long llabs(long long n);

大白话解释: 计算整数的绝对值。

详细说明: 分别用于计算 int、long 和 long long 类型整数的绝对值(正数)。

div, ldiv, lldiv
div_t div(int numer, int denom);
ldiv_t ldiv(long numer, long denom);
lldiv_t lldiv(long long numer, long long denom);

大白话解释: 同时计算除法商和余数。

详细说明: 这些函数同时计算除法的商和余数,并将结果保存在一个结构体中返回。

div_t result = div(37, 5);
printf(“商 = %d, 余数 = %d”, result.quot, result.rem);
// 输出: 商 = 7, 余数 = 2
getenv
char* getenv(const char* name);

大白话解释: 获取环境变量的值。

详细说明: 返回指向环境变量 name 的值的指针。如果该环境变量不存在,则返回 NULL。

char* path = getenv(“PATH”);
if (path) {
    printf(“PATH环境变量: %s”, path);
}

总结与重要提示

1. 内存管理三部曲:malloc分配内存 → 使用内存 → free释放内存。

2. 随机数生成:使用rand前务必用srand初始化种子(常用time(0))。

3. 字符串转换:优先使用strtol/strtod而非atoi/atof,它们更安全且提供错误检测。

4. 程序退出:使用exit正常终止程序,避免使用abort除非发生严重错误。

5. 数组排序:使用qsort前确保提供正确的比较函数。

💡 编程提示:每次使用malloc后检查返回值是否为NULL,避免操作空指针导致程序崩溃!

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部