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

一、前言

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 数组,数组长度为 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 语言中处理字符串和执行相关操作的功能。使用这些函数时需要小心内存管理,避免出现内存泄漏等问题。

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

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

相关文章

大创项目推荐 深度学习中文汉字识别

文章目录 0 前言1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习中文汉字识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xf…

OCP NVME SSD规范解读-4.NVMe IO命令-1

针对NVMe-IO-1到NVMe-IO-14的解读如下&#xff1a; NVMe-IO-1&#xff1a; 设备应支持所有必需的NVMe I/O命令。这是设备能够进行基本数据读写操作的基础要求。NVMe I/O命令包括读、写、删除、擦除等操作&#xff0c;这些是存储设备的核心功能。 NVMe-IO-2&#xff1a; 设备应…

JavaOOP篇----第二十五篇

系列文章目录 文章目录 系列文章目录前言一、一个”.java”源文件中是否可以包含多个类(不是内部类)?有什么限制?二、AnonymousInnerClass(匿名内部类)是否可以继承其它类?是否可以实现接口?三、内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制?四、Java 中…

[计算机提升] Windows系统软件:管理类

3.6 系统软件&#xff1a;管理类 3.6.1 运行 通过运行程序&#xff0c;在打开输入框中输入名称&#xff0c;按下回车后可以打开相应的程序、文件夹、文档或Internet资源&#xff1a; 3.6.2 命令提示符&#xff1a;cmd 在Windows系统中&#xff0c;cmd是指"命令提示符…

nacos入门篇001-安装与启动

1、下载zip包 我这里下载的是版本2.2.0 Nacos 快速开始 2、修改配置文件 2.1集群模式修改成单例模式 vi startup.sh 2.2 修改数据库配置信息 3、初始化数据库 3.1 创建db名称&#xff1a;db_nacos 3.2 执行mysql-schema.sql 3.3 执行完截图&#xff1a; 4、运行脚本启动 …

听GPT 讲Rust源代码--src/tools(34)

File: rust/src/tools/clippy/clippy_lints/src/collection_is_never_read.rs 文件"collection_is_never_read.rs"位于Rust源代码中的clippy_lints工具中&#xff0c;其作用是检查在集合类型&#xff08;如Vec、HashMap等&#xff09;的实例上执行的操作是否被忽略了…

LT8612UX-HDMI2.0 to HDMI2.0 and VGA Converter with Audio,支持三通道视频DAC

HDMI2.0 to HDMI2.0 and VGA Converter with Audio 1. 描述 LT8612UX是一个HDMI到HDMI和vga转换器&#xff0c;它将HDMI2.0数据流转换为HDMI2.0信号和模拟RGB信号。 它还输出8通道I2S和SPDIF信号&#xff0c;使高质量的7.1通道音频。 LT8612UX支持符合HDMI2.0/ 1.4规范的…

ubuntu python播放MP3,wav音频和录音

目录 一.利用pygame&#xff08;略显麻烦&#xff0c;有时候播放不太正常&#xff09;1.安装依赖库2.代码 二.利用mpg123&#xff08;简洁方便&#xff0c;但仅争对mp3&#xff09;1.安装依赖库2.代码 三.利用sox&#xff08;简单方便&#xff0c;支持的文件格式多&#xff09;…

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

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

thingsboard前端缓存--nginx

thingsboardnginx thingsboard部署到阿里云服务器之后&#xff0c;由于登录界面要发送的文件很大&#xff0c;并且服务器的带宽目前有限&#xff0c;因此配置一个nginx&#xff0c;进行前端页面的一些缓存&#xff0c;参考了https://qianchenzhumeng.github.io/posts/Nginx%E5…

C语言编写Windows程序:组合启用/禁用Telnet客户端,并Telnet指定ip和端口

本文程序是将启用/禁用Telnet客户端的命令进行组合&#xff0c;单个命令的解析可参考文章&#xff1a; 启用/禁用Windows功能中的Telnet客户端的命令_()命令将阻止使用telnintel-CSDN博客 源代码如下&#xff1a; #include <stdio.h> #include <stdlib.h> #include…

【重磅新品】小眼睛科技推出紫光同创盘古系列FPGA开发板套件,盘古200K开发板,紫光同创PG2L200H,Logos2系列

FPGA&#xff0c;即现场可编程门阵列&#xff0c;作为可重构电路芯片&#xff0c;已经成为行业“万能芯片”&#xff0c;在通信系统、数字信息处理、视频图像处理、高速接口设计等方面都有不俗的表现。近几年&#xff0c;随着国家战略支持和产业发展&#xff0c;国产FPGA迎来迅…

单机+内部备份_全备案例

此场景为单机数据库节点内部备份&#xff0c;方便部署和操作&#xff0c;但备份REPO与数据库实例处于同一个物理主机&#xff0c;冗余度较低。 前期准备 配置ksql免密登录(必须) 在Kingbase数据库运行维护中&#xff0c;经常用到ksql工具登录数据库&#xff0c;本地免密登录…

【网络安全 | XCTF】simple_transfer

考察kali基本工具的使用 方法一 打开文件如图&#xff1a; 存在较多协议&#xff0c;将协议分级&#xff1a; 可以看到DLEP协议占比最大&#xff1a; 将其作为过滤器应用&#xff1a; 搜索DLEP&#xff1a; 并没有有利信息&#xff0c;但观察到多数数据包损坏&#xff1a; 执行…

Transformer(seq2seq、self-attention)学习笔记

在self-attention 基础上记录一篇Transformer学习笔记 Transformer的网络结构EncoderDecoder 模型训练与评估 Transformer的网络结构 Transformer是一种seq2seq 模型。输入一个序列&#xff0c;经过encoder、decoder输出结果也是一个序列&#xff0c;输出序列的长度由模型决定…

【超图】SuperMap iClient3D for WebGL/WebGPU —— 坐标系位置 —— Cartesian2

作者&#xff1a;taco 说到关于地理必然逃不开位置的关系。借用百度百科的内容来说地理学&#xff08;geography&#xff09;&#xff0c;是研究地球表层空间地理要素或者地理综合体空间分布规律、时间演变过程和区域特征的一门学科。所以位置&坐标系必然逃不掉了。那么在S…

自检服务器,无需服务器、不用编程。

自检服务器&#xff0c;无需服务器、不用编程。 大家好&#xff0c;我是JavaPub. 这几年自媒体原来热&#xff0c;很多人都知道了个人 IP 的重要性。连一个搞中医的朋友都要要做一个自己的网站&#xff0c;而且不想学编程、还不想花 RMB 租云服务。 老读者都知道&#xff0c…

SpringCloud(H版alibaba)框架开发教程之Ribbon负载均衡和Openfeign远程调用——附源码(3)

源码地址在这套教程的第一个里 我们打开order80的主类上的注释 Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具&#xff0c;它基于Netflix Ribbon实现。通过Spring Cloud的封装&#xff0c;可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的…

[RoarCTF 2019]Easy Java(java web)

题目 页面如下 页面长得像sql注入 点击help看一下 这里需要了解java web目录结构 WEB INF:Java的web应用安全目录&#xff1b; 此外如果想在页面访问WEB-INF应用里面的文件&#xff0c;必须要通过web.xml进行相应的映射才能访问&#xff1b; WEB-INF是Java Web应用程序中的一…

Java EE 网络原理之HTTPS

文章目录 1. HTTPS 是什么&#xff1f;2. "加密" 是什么&#xff1f;3. HTTPS 的工作过程3.1 引入对称加密3.2 引入非对称加密3.3 中间人攻击3.4 引入证书 4. Tomecat4.1 tomcat 的作用 1. HTTPS 是什么&#xff1f; HTTPS也是⼀个应用层协议&#xff0c;是在 HTTP …