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

二、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 数组,数组长度为 numptr = (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 数组,数组长度为 numptr = (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); // 设置随机数发生器的种子为 123for (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");// 退出程序,并返回状态码 0exit(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 语言中处理字符串和执行相关操作的功能。使用这些函数时需要小心内存管理,避免出现内存泄漏等问题。
相关文章:
C语言实例_stdlib.h库函数功能及其用法详解
一、前言 C语言作为一种高效、灵活的编程语言,标准库的使用对于开发人员来说是不可或缺的。其中,stdlib.h是C语言中一个重要的标准库头文件,提供了许多常用的函数和工具,以便开发人员能够更加便捷地进行内存管理、字符串处理、随…...
Error in onLoad hook: “URIError: URI malformed“ found in…报错处理以及完善uniapp针对对象传参
使用uniapp传参的过程中遇到这么一个问题,当我们需要传整个对象作为参数时,我会先将这个对象先编码,然后再解码,从而获取到怎么参数,平常实操的时候也没有遇到过问题,但是今天测试的时候,刚好一…...
c语言-位操作符练习题
文章目录 前言一、n&(n-1)的运用场景(n为整数)二、&1 和 >>的应用场景总结 前言 本篇文章介绍利用c语言的位操作符解决一些练习题,目的是掌握各个位操作符的使用和应用场景。 表1.1为c语言中的位操作符 操作符含义&按位与|按位或^按位异或~按位…...
园林机械部件自动化三维测量检测形位公差-CASAIM自动化三维检测工作站
随着园林机械的广泛应用,对其机械部件的精确测量需求也日益增加。传统的测量方法不仅效率低下,而且精度难以保证,因此,自动化三维测量技术成为了解决这一问题的有效途径。本文将重点介绍CASAIM自动化三维检测工作站在园林机械部件…...
o2o生活通全开源尊享版+多城市切换+企业付款+交友IM+平台快报
搭建教程 1.把 pigo2ov282.sql 文件里面的网址 test.souho.net 全部批量替换为你的自己的 2.使用 phpmyadmin 导入 pigo2ov282.sql 到你的数据库(直接访问/phpmyadmin 即可) 3.修改数据库文件/conf/db.php 里的数据库连接信息(请勿使用记事本…...
UE4开发BIM程序 的 流程
某机构BIM设计研究中心主任马晓龙,他对编程颇有研究。今天他会用通俗易懂的语言来讲解基于游戏引擎UE4的BIM技术可视化应用。对于想要自己开发程序的设计师一定要读一下! 1)关于UE4——UE4是什么? 可以简单的理解为,一…...
【AI大语言模型】ChatGPT在地学、GIS、气象、农业、生态、环境等领域中的应用
以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮,可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…...
【面试题】写一个睡眠函数
题目要求 请你编写一个异步函数,它接收一个正整数参数 millis ,并休眠 millis 毫秒。要求此函数可以解析任何值。 示例 1: 输入:millis 100 输出:100 解释: 在 100ms 后此异步函数执行完时返回一个 Pro…...
4. 云原生之kubesphere基础服务搭建
文章目录 安装kubesphere插件服务暴露NodePort方式LoadBalancer方式安装 OpenELB部署eip资源配置网关启动网关创建路由测试网关路由ingress高级功能在服务中配置LoadBalancer 基础设施部署服务部署建议helm仓库添加helm仓库 运维相关部署gitlab部署nexus3部署harbor 研发相关 安…...
思福迪运维安全管理系统 任意文件读取漏洞
产品简介 思福迪运维安全管理系统是思福迪开发的一款运维安全管理堡垒机 漏洞概述 由于思福迪运维安全管理系统 GetCaCert路由存在任意文件读取漏洞,攻击者可通过该漏洞在服务器端读取任意文件敏感内容,可能导致攻击者后续获取到相关的服务器权限 资…...
OCR在审核应用落地
本文字数:6686字 预计阅读时间:35分钟 01 背景 1、业务背景 在传统视频审核场景中,审核人员需要对进审视频中的文字内容进行逐一审核,避免在文字上出现敏感词、违禁词或者广告等相关词汇。这种人工审核费时费力,并且由…...
借贷协议 Tonka Finance:铭文资产流动性的新破局者
“Tonka Finance 是铭文赛道中首个借贷协议,它正在为铭文资产赋予捕获流动性的能力,并为其构建全新的金融场景。” 在 2023 年的 1 月,比特币 Ordinals 协议被推出后,包括 BRC20,Ordinals 等在内的系列铭文资产在包括比…...
Python+Yolov5+Qt交通标志特征识别窗体界面相片视频摄像头
程序示例精选 PythonYolov5Qt交通标志特征识别窗体界面相片视频摄像头 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《PythonYolov5Qt交通标志特征识别窗体界面相片视频摄像头》编写代码&a…...
浅谈高并发以及三大利器:缓存、限流和降级
引言 高并发背景 互联网行业迅速发展,用户量剧增,系统面临巨大的并发请求压力。 软件系统有三个追求:高性能、高并发、高可用,俗称三高。三者既有区别也有联系,门门道道很多,全面讨论需要三天三夜&#…...
深入ArkUI:深入实战组件text和text input
文章目录 Text组件介绍Text组件的属性方法Text:文本显示组件4.3TextInput组件实战案例:图片宽度控制页面本文总结要点回顾在今天的课程中,我们将深入学习ArkUI提供的基础组件,着重探讨text和text input两个组件。 Text组件介绍 Text组件是一个用于显示文本的组件,其主要作…...
WPF 基础(Binding 二)
续接上文,本章继续讲解WPF Binding相关知识,主要内容是绑定的模式和绑定源(Source) 5绑定模式 在使用Binding类的时候有4中绑定模式可以选择 BindingMode TwoWay导致对源属性或目标属性的更改可自动更新对方。此绑定类型适用于…...
限制el-upload组件的上传文件大小
限制el-upload组件的上传文件大小 <el-upload :before-upload"handleBeforeUpload"><!-- 其他组件内容 --> </el-upload>Vue实例中定义handleBeforeUpload方法来进行文件大小的验证。你可以使用file.size属性来获取文件的大小,并与你期…...
什么是爬虫,为什么爬虫会导致服务器负载跑满
在我们日常使用服务器的过程中,经常会有遇到各种各样的问题。今天就有遇到用户来跟德迅云安全反馈自己服务器负载跑满,给用户详细排查后也未发现异常,抓包查看也没有明显攻击特征,后续查看发现是被爬虫爬了,调整处理好…...
线上隐私保护的未来:分布式身份DID的潜力
在日益数字化的世界中,人们的生活越来越多地依赖于互联网,数字身份也因而变得越来越重要。根据法律规定,互联网应用需要确认用户的真实身份才能提供各种服务,而用户则希望在进行身份认证的同时能够尽量保护他们的个人隐私…...
服务器被入侵后如何查询连接IP以及防护措施
目前越来越多的服务器被入侵,以及攻击事件频频的发生,像数据被窃取,数据库被篡改,网站被强制跳转到恶意网站上,网站在百度的快照被劫持等等的攻击症状层出不穷,在这些问题中,如何有效、准确地追…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
