C语言实例_stdlib.h库函数功能及其用法详解

news2024/11/24 22:31:02

一、前言

C语言作为一种高效、灵活的编程语言,标准库的使用对于开发人员来说是不可或缺的。其中,stdlib.h是C语言中一个重要的标准库头文件,提供了许多常用的函数和工具,以便开发人员能够更加便捷地进行内存管理、字符串处理、随机数生成等操作。本文将对stdlib.h中的各个函数进行全面介绍,包括它们的功能和使用方法,以帮助开发者更好地理解和利用该标准库。

image-20230816112832472

二、stdlib.h函数介绍

C语言的标准库头文件 stdlib.h 提供了一些常用的函数,用于执行各种实用程序和内存管理任务。

以下是 stdlib.h 头文件中包含的主要函数及其功能的详细介绍:

【1】内存管理函数

  • malloc(size_t size):动态分配指定大小的内存块,并返回指向该内存块的指针。

  • calloc(size_t num, size_t size):动态分配 num 个长度为 size 字节的连续内存区域,并将每个字节初始化为零。

  • realloc(void* ptr, size_t size):重新分配先前分配的内存块 ptr 的大小为 size 字节,并返回指向重新分配后内存块的指针。

  • free(void* ptr):释放之前通过动态内存分配函数分配的内存。

【2】字符串转换函数

  • atoi(const char* str):将字符串转换为对应的整数并返回结果。

  • atol(const char* str):将字符串转换为对应的长整数并返回结果。

  • atof(const char* str):将字符串转换为对应的双精度浮点数并返回结果。

  • itoa(int value, char* str, int base):将整数转换为字符串并存储在 str 中。

  • rand(void):生成伪随机数。

  • srand(unsigned int seed):设置随机数发生器的种子。

【3】环境控制函数

  • system(const char* command):执行命令行参数中指定的 shell 命令。
  • exit(int status):终止程序的执行并返回状态码。
  • _Exit(int status):终止程序的执行并返回状态码,不进行清理操作。
  • abort(void):中止程序的执行,并生成一个异常终止信号。

【4】动态分配排序函数

  • qsort(void* base, size_t nmemb, size_t size, int (*compar)(const void*, const void*)):对数组进行快速排序。

【5】字符串处理函数

  • rand_r(unsigned int* seedp):可重入版本的 rand() 函数。
  • system_l(const char* command, locale_t loc):根据指定的本地化环境执行命令。
  • posix_memalign(void** memptr, size_t alignment, size_t size):分配对齐的内存块。
  • aligned_alloc(size_t alignment, size_t size):分配对齐的内存块。

三、代码示例

3.1 内存管理函数

【1】malloc(size_t size):动态分配指定大小的内存块,并返回指向该内存块的指针。

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

int main() {
    int* ptr;
    int num = 5;

    // 动态分配一个 int 数组,数组长度为 num
    ptr = (int*)malloc(num * sizeof(int));
    
    // 检查内存是否成功分配
    if (ptr == NULL) {
        printf("内存分配失败\n");
        exit(1);
    }

    // 使用分配的内存
    for (int i = 0; i < num; i++) {
        ptr[i] = i + 1;
    }
    
    // 输出数组的值
    for (int i = 0; i < num; i++) {
        printf("%d ", ptr[i]);
    }

    // 释放内存
    free(ptr);

    return 0;
}

【2】calloc(size_t num, size_t size):动态分配 num 个长度为 size 字节的连续内存区域,并将每个字节初始化为零。

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

int main() {
    int* ptr;
    int num = 5;

    // 动态分配一个 int 数组,数组长度为 num,并初始化为零
    ptr = (int*)calloc(num, sizeof(int));
    
    // 检查内存是否成功分配
    if (ptr == NULL) {
        printf("内存分配失败\n");
        exit(1);
    }

    // 输出数组的值
    for (int i = 0; i < num; i++) {
        printf("%d ", ptr[i]);
    }

    // 释放内存
    free(ptr);

    return 0;
}

【3】realloc(void* ptr, size_t size):重新分配先前分配的内存块 ptr 的大小为 size 字节,并返回指向重新分配后内存块的指针。

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

int main() {
    int* ptr;
    int num = 5;

    // 动态分配一个 int 数组,数组长度为 num
    ptr = (int*)malloc(num * sizeof(int));
    
    // 检查内存是否成功分配
    if (ptr == NULL) {
        printf("内存分配失败\n");
        exit(1);
    }

    // 输出数组的值
    for (int i = 0; i < num; i++) {
        printf("%d ", ptr[i]);
    }

    // 重新分配内存为更大的数组
    num = 10;
    ptr = (int*)realloc(ptr, num * sizeof(int));

    // 使用重新分配的内存
    for (int i = 5; i < num; i++) {
        ptr[i] = i + 1;
    }

    // 输出数组的值
    for (int i = 0; i < num; i++) {
        printf("%d ", ptr[i]);
    }

    // 释放内存
    free(ptr);

    return 0;
}

【4】free(void* ptr):释放之前通过动态内存分配函数分配的内存。

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

int main() {
    int* ptr;

    // 动态分配一个 int 数组
    ptr = (int*)malloc(5 * sizeof(int));
    
    // 检查内存是否成功分配
    if (ptr == NULL) {
        printf("内存分配失败\n");
        exit(1);
    }

    // 使用分配的内存
    for (int i = 0; i < 5; i++) {
        ptr[i] = i + 1;
    }
    
    // 输出数组的值
    for (int i = 0; i < 5; i++) {
        printf("%d ", ptr[i]);
    }

    // 释放内存
    free(ptr);

    return 0;
}

以上是这些内存管理函数的基本用法。动态内存管理函数允许在程序运行时根据需要分配或释放内存,提供了更灵活和高效地使用内存的方式。重要的是记得在使用完毕后及时释放内存,以避免内存泄漏问题。

3.2 字符串转换与随机数函数

这里是给这些字符串转换函数和随机数函数的例子和用法介绍:

【1】atoi(const char* str):将字符串转换为对应的整数并返回结果。

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

int main() {
    const char* str = "12345";
    int num = atoi(str);
    
    printf("字符串转换为整数:%d\n", num);

    return 0;
}

【2】atol(const char* str):将字符串转换为对应的长整数并返回结果。

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

int main() {
    const char* str = "1234567890";
    long num = atol(str);
    
    printf("字符串转换为长整数:%ld\n", num);

    return 0;
}

【3】atof(const char* str):将字符串转换为对应的双精度浮点数并返回结果。

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

int main() {
    const char* str = "3.14159";
    double num = atof(str);
    
    printf("字符串转换为双精度浮点数:%f\n", num);

    return 0;
}

【4】itoa(int value, char* str, int base):将整数转换为字符串并存储在 str 中。

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

int main() {
    int num = 12345;
    char str[20];
    
    itoa(num, str, 10);
    
    printf("整数转换为字符串:%s\n", str);

    return 0;
}

【5】rand(void):生成伪随机数。

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

int main() {
    srand(time(NULL)); // 设置随机数发生器的种子为当前时间
    
    for (int i = 0; i < 5; i++) {
        int randomNum = rand();
        printf("随机数:%d\n", randomNum);
    }

    return 0;
}

【6】srand(unsigned int seed):设置随机数发生器的种子。

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

int main() {
    srand(123); // 设置随机数发生器的种子为 123
    
    for (int i = 0; i < 5; i++) {
        int randomNum = rand();
        printf("随机数:%d\n", randomNum);
    }

    return 0;
}

3.3 环境控制函数

【1】system(const char* command):执行命令行参数中指定的 shell 命令。

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

int main() {
    const char* command = "ls -l"; // 列出当前目录下的文件和文件夹
    
    int status = system(command);
    
    if (status == -1) {
        printf("命令执行失败。\n");
    } else {
        printf("命令执行成功。\n");
    }

    return 0;
}

【2】exit(int status):终止程序的执行并返回状态码。

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

int main() {
    printf("程序开始执行。\n");
    
    // 退出程序,并返回状态码 0
    exit(0);
    
    printf("此行不会被执行。\n");

    return 0;
}

【2】_Exit(int status):终止程序的执行并返回状态码,不进行清理操作。

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

int main() {
    printf("程序开始执行。\n");
    
    // 退出程序,并返回状态码 0,不进行清理操作
    _Exit(0);
    
    printf("此行不会被执行。\n");

    return 0;
}

【3】abort(void):中止程序的执行,并生成一个异常终止信号。

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

int main() {
    printf("程序开始执行。\n");
    
    printf("触发异常终止信号。\n");
    abort();
    
    printf("此行不会被执行。\n");

    return 0;
}

3.4 动态分配排序函数

这里是关于动态分配排序函数的例子和用法介绍:

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

// 比较函数,用于指定排序顺序
int compareFunc(const void* a, const void* b) {
    // 将输入的指针转换为所需的类型
    int num1 = *(int*)a;
    int num2 = *(int*)b;

    // 按升序进行排序
    if (num1 < num2) {
        return -1;
    } else if (num1 > num2) {
        return 1;
    } else {
        return 0;
    }
}

int main() {
    int arr[] = {5, 2, 8, 6, 1, 3, 9, 7, 4};
    int size = sizeof(arr) / sizeof(arr[0]);

    printf("排序前的数组:");
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    // 使用 qsort 对数组进行排序
    qsort(arr, size, sizeof(int), compareFunc);

    printf("排序后的数组:");
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}

在这个例子中,定义了一个整型数组 arr,包含了一些无序的元素。使用 qsort 函数对该数组进行排序。qsort 函数接收四个参数:要排序的数组的起始地址 base,数组中元素的个数 nmemb,每个元素的字节大小 size,以及一个比较函数 compar。比较函数用于指定排序的顺序。

compareFunc中,传入的指针转换为 int 类型,并按照升序排序的规则进行比较。如果第一个元素小于第二个元素,返回 -1;如果第一个元素大于第二个元素,返回 1;如果两个元素相等,返回 0

最后,输出排序前和排序后的数组,可以看到数组已经按升序进行了排序。

qsort 函数是对 C 标准库的一部分,经过高效的优化,可以处理不同类型的数组,而不仅仅是整型数组。

3.5 字符串处理函数

【1】rand_r(unsigned int* seedp):可重入版本的 rand() 函数,用于生成伪随机数。

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

int main() {
    unsigned int seed = time(NULL);

    for (int i = 0; i < 5; i++) {
        int randomNum = rand_r(&seed);
        printf("%d ", randomNum);
    }
    printf("\n");

    return 0;
}

在这个例子中,使用 rand_r 函数生成了5个伪随机数。通过向 rand_r 函数传递一个指向种子的指针,确保每次调用 rand_r 函数时都使用不同的种子,使其成为可重入函数。

【2】system_l(const char* command, locale_t loc):根据指定的本地化环境执行命令。

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

int main() {
    const char* command = "ls -l"; // 列出当前目录下的文件和文件夹
    locale_t loc = newlocale(LC_ALL_MASK, "", NULL);

    int status = system_l(command, loc);

    if (status == -1) {
        printf("命令执行失败。\n");
    } else {
        printf("命令执行成功。\n");
    }

    freelocale(loc);

    return 0;
}

在这个例子中,使用 system_l 函数执行了一个命令 ls -l,该命令用于列出当前目录下的文件和文件夹。使用 newlocale 函数创建了一个新的本地化环境 loc,并将其作为参数传递给 system_l 函数。最后,使用 freelocale 函数释放本地化环境。

【3】posix_memalign(void memptr, size_t alignment, size_t size):分配对齐的内存块。

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

int main() {
    void* memPtr;
    size_t alignment = 16; // 对齐要求为16字节
    size_t size = 32; // 分配32字节的内存

    int status = posix_memalign(&memPtr, alignment, size);

    if (status == 0) {
        printf("内存分配成功。\n");
        
        // 使用分配的内存
        
        free(memPtr);
    } else {
        printf("内存分配失败。\n");
    }

    return 0;
}

在这个例子中,使用 posix_memalign 函数分配了一个对齐的内存块,要求对齐要求为16字节,分配32字节的内存。通过传递指向 memPtr 的指针,可以在函数内部接收分配的内存地址。最后,使用 free 函数释放内存。

【4】aligned_alloc(size_t alignment, size_t size):分配对齐的内存块。

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

int main() {
    size_t alignment = 16; // 对齐要求为16字节
    size_t size = 32; // 分配32字节的内存

    void* memPtr = aligned_alloc(alignment, size);

    if (memPtr != NULL) {
        printf("内存分配成功。\n");
        
        // 使用分配的内存
        
        free(memPtr);
    } else {
        printf("内存分配失败。\n");
    }

    return 0;
}

在这个例子中,使用 aligned_alloc 函数分配了一个对齐的内存块,要求对齐要求为16字节,分配32字节的内存。通过将返回的内存指针赋值给 memPtr 变量,可以获得分配的内存地址。最后,使用 free 函数释放内存。

这些字符串处理函数提供了在 C 语言中处理字符串和执行相关操作的功能。使用这些函数时需要小心内存管理,避免出现内存泄漏等问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1343354.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《深入理解JAVA虚拟机笔记》运行时栈帧、方法分派、动态类型

运行时栈帧结构 Java 虚拟机以方法作为最基本的执行单元&#xff0c;“栈帧”&#xff08;Stack Frame&#xff09;则是用于支持虚拟机进行方法调用和方法执行背后的数据结构&#xff0c;它也是虚拟机运行时数据区中的虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈…

电气产品外壳常用材质PA、PC、PBT、ABS究竟是什么?

在如今工业制造领域&#xff0c;各种改性塑料、复合材料以及轻质合金材料的运用日趋成熟。在电气领域&#xff0c;不同电气产品的外壳、组件材质采用不同材料&#xff0c;以同为科技&#xff08;TOWE&#xff09;电气产品为例&#xff0c;工业连接器系列产品采用PA6外壳材质、机…

python+django网上购物商城系统o9m4k

语言&#xff1a;Python 框架&#xff1a;django/flask可以定制 软件版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发工具pycharm/vscode都可以 前端框架:vue.js 系统使用过程主要涉及到管理员和用户两种角色&#xff0c;主要包含个…

javascript实现数据双向绑定

ES5中的双向绑定 ES5中的对象属性类型有两种&#xff1a;分别是数据属性和访问器属性 一&#xff0c;数据属性 数据属性包含一个数据值的位置。在这个位置可以读取和写入值。数据属性有4个描述其行为的特性 1&#xff0c;configurable:表示能否通过delete删除属性而重新定义…

利用Pandas进行高效网络数据获取

利用Pandas进行高效网络数据获取 背景&#xff1a; ​ 最近看到一篇关于使用Pandas模块进行爬虫的文章&#xff0c;觉得很有趣&#xff0c;这里为大家详细说明。 基础铺垫&#xff1a; ​ pd.read_html pandas 库中的一个函数&#xff0c;用于从 HTML 页面中读取表格数据并…

CEC2017(Python):五种算法(PSO、RFO、SSA、DE、HHO)求解CEC2017

一、5种算法简介 1、粒子群优化算法PSO 2、红狐优化算法RFO 3、麻雀搜索算法SSA 4、差分进化算法DE 5、哈里斯鹰优化算法HHO 二、CEC2017简介 参考文献&#xff1a; [1]Awad, N. H., Ali, M. Z., Liang, J. J., Qu, B. Y., & Suganthan, P. N. (2016). “Problem de…

详解“量子极限下运行的光学神经网络”——相干伊辛机

量子计算和量子启发计算可能成为解答复杂优化问题的新前沿&#xff0c;而经典计算机在历史上是无法解决这些问题的。 当今最快的计算机可能需要数千年才能完成高度复杂的计算&#xff0c;包括涉及许多变量的组合优化问题&#xff1b;研究人员正在努力将解决这些问题所需的时间缩…

白话机器学习的数学-2-分类

1、设置问题 图片分类&#xff1a;只根据尺寸把它分类为 纵向图像和横向图像。 如果只用一条线将图中白色的点和黑色的点分开&#xff1a; 这次分类的目的就是找到这条线。 2、内积 找到一条线&#xff0c;这是否意味着我们要像学习回归时那样&#xff0c;求出一次函数的斜率…

写在2023岁末:敏锐地审视量子计算的当下

本周&#xff0c;《IEEE Spectrum》刊登了一篇出色的文章&#xff0c;对量子计算&#xff08;QC&#xff09;的近期前景进行了深入探讨。 文章的目的并不是要给量子计算的前景泼冷水&#xff0c;而是要说明量子计算的前景还很遥远&#xff0c;并提醒读者量子计算的用例可能很窄…

【Minikube Prometheus】基于Prometheus Grafana监控由Minikube创建的K8S集群

文章目录 1. 系统信息参数说明2. Docker安装3. minikube安装4. kubectl安装5. Helm安装6. 启动Kubernetes集群v1.28.37. 使用helm安装Prometheus8. 使用helm安装Grafana9. Grafana的Dashboard设定10. 设定Prometheus数据源11. 导入Kubernetes Dashboard12. 实验过程中的常见问题…

RabbitMQ之快速入门、上手

前言 学习一样新技术、新框架&#xff0c;最重要的是学习其思想、原理。即原理性思维。 如果是因为工作原因&#xff0c;需要快速上手RabbitMQ&#xff0c;本篇或许适合你。 核心概念 Connection&#xff1a;publisher&#xff0f;consumer 和 broker 之间的 TCP 连接Channel…

亚信安慧AntDB数据并行加载工具的实现(一)

1.概述 数据加载速度是评判数据库性能的重要指标&#xff0c;能否提高数据加载速度&#xff0c;对文件数据进行并行解析&#xff0c;直接影响数据库运维管理效率。基于此&#xff0c;AntDB分布式数据库提供了两种数据加载方式&#xff1a; 一是类似于PostgreSQL的Copy命令&am…

java spring boot 自定义 aop

以一个锁的加锁和释放为例 1、先定义注解 /*** 锁切面* author fmj*/ Retention(RetentionPolicy.RUNTIME) Target(ElementType.METHOD) public interface VersionLockAOP { }2、然后定义切面类以及切点 /*** 切面*/ Component Aspect Slf4j public class VersionLockAOPAspe…

GitHub Copilot 终极详细介绍

编写代码通常是一项乏味且耗时的任务。现代开发人员一直在寻找新的方法来提高编程的生产力、准确性和效率。 像 GitHub Copilot 这样的自动代码生成工具可以使这成为可能。 GitHub Copilot 到底是什么&#xff1f; GitHub Copilot 于 2021 年 10 月推出&#xff0c;是 GitHub 的…

idea配置docker推送本地镜像到远程私有仓库

目录 1&#xff0c;搭建远程Docker 私有仓库 Docker registry 2&#xff0c;Windows10/11系统上安装Docker Desktop 3&#xff0c;idea 配置远程私有仓库地址 4&#xff0c;idea 配置Docker 5&#xff0c;idea在本地构建镜像 6&#xff0c;推送本地Docker镜像到远程 Dock…

第3课 获取并播放音频流

本课对应源文件下载链接&#xff1a; https://download.csdn.net/download/XiBuQiuChong/88680079 FFmpeg作为一套庞大的音视频处理开源工具&#xff0c;其源码有太多值得研究的地方。但对于大多数初学者而言&#xff0c;如何快速利用相关的API写出自己想要的东西才是迫切需要…

USB -- STM32F103 USB VIDEO(视频)Camera同步传输讲解(九)

目录 链接快速定位 前沿 1 描述符修改 1.1 设备描述符修改 1.2 配置描述符修改 1.3 字符串描述符修改 1.4 编译报错修改 2 增加功能函数 2.1 Camera功能模块介绍 2.2 USB复位函数修改 2.3 Speaker_Data_Setup函数修改 2.4 非零端点函数修改 2.5 JEPG数据获取 3…

IDEA使用HDFS的JavaApi

注&#xff1a;以下代码操作是利用junit在java测试文件夹中实现。 1. 准备工作 1.1 创建测试类 创建测试类&#xff0c;并定义基本变量 public class HDFSJAVAAPI {// 定义后续会用到的基本变量public final String HDFS_PATH "hdfs://hadoop00/";Configuration …

骑砍战团MOD开发(27)-module_tableau_materials.py材质

一.配置材质资源 OpenBrf寻找对应材质资源. tableau配置材质资源 ("round_shield_1", 0, "sample_shield_round_1", 512, 256, 0, 0, 0, 0,[(store_script_param, ":banner_mesh", 1),(set_fixed_point_multiplier, 100),(init_position, pos1),…

基于Freeswitch实现的Volte网视频通知应用

现在运营商的Volte网络已经很好的支持视频通话了&#xff0c;因此在原来的电话语音通知的基础上&#xff0c;可以更进一步实现视频的通知&#xff0c;让用户有更好的体验&#xff0c;本文就从技术角度&#xff0c;基于Freeswitch来实现此类应用&#xff08;本文假设读者已对Fre…