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以及防护措施
目前越来越多的服务器被入侵,以及攻击事件频频的发生,像数据被窃取,数据库被篡改,网站被强制跳转到恶意网站上,网站在百度的快照被劫持等等的攻击症状层出不穷,在这些问题中,如何有效、准确地追…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...

Mysql故障排插与环境优化
前置知识点 最上层是一些客户端和连接服务,包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念,为通过安全认证接入的客户端提供线程。同样在该层上可…...