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://xiahunao.cn/news/2661994.html

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

相关文章

NCNN环境部署及yolov5pt转ncnn模型转换推理

该内容还未完整&#xff0c;笔记内容&#xff0c;持续补充。 〇开发环境版本 vs2022 cmake3.21.1 ncnn20231027发行版 yolov5s v6.2 vunlkan1.2.198.1 Protobuf3.20.0 Opencv3.4.1 一、模型转换 yolov5s v6.2训练的pt模型&#xff0c;直接导出tourchscript&#xff0c…

开放式蓝牙耳机学生党适合买哪些?平价好用的开放式耳机推荐

对于学生党来说&#xff0c;想要买一款既平价又好用的开放式蓝牙耳机&#xff0c;确实需要仔细挑选&#xff0c;那啥是开放式耳机呢&#xff1f;简单来说&#xff0c;开放式耳机就是那种不把耳朵全部封闭起来的耳机&#xff0c;声音可以流通&#xff0c;听起来更自然、舒适&…

Conda:Python环境管理的瑞士军刀

在数据科学和机器学习的世界中&#xff0c;管理各种库和依赖关系的重要性不容忽视。Conda 就是为此而生的强大工具。本文将深入探讨 Conda 的简介、功能以及使用示例&#xff0c;帮助你更好地理解和使用这个工具。 Conda 简介 Conda 是一个开源的包管理系统和环境管理系统&am…

【Shell编程练习】通过位置变量创建 Linux 系统账户及密码

系列文章目录 输出Hello World 系列文章目录位置变量代码实现运行结果 位置变量 位置变量将以数字方式对变量进行命名&#xff0c;可将命令行参数的值存储到脚本中。要从命令行、函数或脚本执行等处传递参数时&#xff0c;就需要在 Shell 脚本中使用位置参数变量。下表为常用…

并发查询数据库并做汇总处理(多线程+CompletableFuture方式)

文章目录 1.需求说明2.准备工作3.线程池执行4.使用CompletableFuture 1.需求说明 我们想要通过更快的方式查询10w条user表数据内容&#xff0c;做数据的汇总&#xff0c;得到10w个用户的年龄分布。 此时很容易想到用多线程处理&#xff0c;但知易行难&#xff0c;还是动手来写…

rsync的介绍与使用

rsync的介绍与使用 一、简介 rsync&#xff08;remote synchronize&#xff09;是Liunx/Unix下的一个远程数据同步工具。它能够以非常高效的方式传输和同步文件&#xff0c;它可以将一个目录的文件快速地同步到另一个目录&#xff0c;还可以通过网络快速同步多台主机间的文件…

【VTK-Rendering::Core】第一期 vtkCoordinate坐标系统

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ&#xff1a;870202403 前言 本文分享vtkCoordinate源码解析&#xff0c;并对VTK中的各种坐标变换进行分析&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易会继续努力分享&#xff…

AIGC时代下,结合ChatGPT谈谈儿童教育

引言 都2024年了&#xff0c;谈到儿童教育&#xff0c;各位有什么新奇的想法嘛 我觉得第一要务&#xff0c;要注重习惯养成&#xff0c;我觉得聊习惯养成这件事情范围有点太大了&#xff0c;我想把习惯归纳于底层逻辑&#xff0c;我们大家都知道&#xff0c;在中国式教育下&a…

Glary Utilities Pro - 电脑系统优化全面指南:详尽使用教程

软件简介&#xff1a; Glary Utilities Pro 是一款全面的电脑优化工具&#xff0c;它旨在帮助用户提升计算机的性能和稳定性。这款软件提供了多种功能&#xff0c;包括系统清理、优化、修复以及保护。通过一键扫描&#xff0c;它可以识别并清除无用文件、临时数据、注册表错误等…

AIGC开发:调用openai的API接口

简介 开始进行最简单的使用&#xff1a;通过API调用openai的模型能力 OpenAI的能力如下图&#xff1a; 文本生成模型 OpenAI 的文本生成模型&#xff08;通常称为生成式预训练 Transformer 或大型语言模型&#xff09;经过训练可以理解自然语言、代码和图像。这些模型提供文…

这是蛰伏的第 1 年 —— 2023 年度总结

时间过得老快了&#xff0c;一下子就到 2023 年年底了&#xff0c;感觉自己好像什么都没做似的。 不过&#xff0c;又到了年终总结季了&#xff0c;正好跟大家唠唠嗑&#xff0c;我就想到啥说啥了。 工作淡如水 先聊聊工作的事情。回顾过去一年的工作&#xff0c;我最大的感…

微软CEO纳德拉当选2023年度CEO,AI大模型崛起成重要趋势;Mixtral 8x7B 真的击败了 GPT 3.5 Turbo 吗?

&#x1f989; AI新闻 &#x1f680; 微软CEO纳德拉当选2023年度CEO&#xff0c;AI大模型崛起成重要趋势 摘要&#xff1a;2023年被认为是AI大模型崛起之年&#xff0c;微软CEO纳德拉凭借对AI的投资和领导力当选2023年度CEO。纳德拉将AI技术融入微软的产品和服务中&#xff0…

【解决问题】pyinstaller打包python应用进行快速分发

pyinstaller打包python应用进行快速分发 问题起因先利其器再善其事试用运行 问题起因 有同学问我要接口的应用&#xff0c;于是试了一下python打包成exe的过程。 先利其器 主要使用pyinstaller&#xff0c;可以通过pip安装 pip install pyinstaller安装过程如图 再善其事…

微服务全链路灰度方案介绍

目录 一、单体架构下的服务发布 1.1 蓝绿发布 二、微服务架构下的服务发布 三、微服务场景下服务发布的问题 四、全链路灰度解决方案 4.1 物理环境隔离 4.2 逻辑环境隔离 4.3 全链路灰度方案实现技术 4.3.1 标签路由 4.3.2 节点打标 4.3.3 流量染色 4.3.4 分布式链路…

力扣题目学习笔记(OC + Swift)19. 删除链表的倒数第 N 个结点

19. 删除链表的倒数第 N 个结点 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 此题目为链表题&#xff0c;拿出我们的杀手锏&#xff0c;链表解题经典三把斧&#xff1a; 哑巴节点栈快慢指针 关于内存问题&#xff1a;由于Swift及…

无论男孩女孩都要尽情打扮

这款柔软又细腻的开衫外套 上身体验感很不错的哈 舒适软糯百搭还透气&#xff0c;抗起球的面料 黑灰两色简单大方 胸前加上了流行的刺绣设计&#xff0c;可爱又精致 单穿内搭都可&#xff0c;现在天气还比较冷 外面可以套个羽绒服之类的 时尚叠穿风&#xff0c;韩系范儿…

Web自动化测试:Selenium入门到精通

前言 说到自动化测试&#xff0c;就不得不提大名鼎鼎的Selenium。Selenium 是如今最常用的自动化测试工具之一&#xff0c;支持快速开发自动化测试框架&#xff0c;且支持在多种浏览器上执行测试。 Selenium学习难度小&#xff0c;开发周期短。对测试人员来说&#xff0c;如果…

模版匹配历劫之路1-匹配点太多如何解决

1测试图片 2初步推测是否是提取的点太多而导致匹配时间很长 2.1通过canny的算法来提取检测点 import numpy as np import cv2 import time import matplotlib.pyplot as pltclass GeoMatch:def __init__(self):self.noOfCordinates0 # 坐标数组中元素的个数self.cordinates…

ArcGIS批量计算shp面积并导出shp数据总面积(建模法)

在处理shp数据时&#xff0c; 又是我们需要知道许多个shp字段的批量计算&#xff0c;例如计算shp的总面积、面积平均值等&#xff0c;但是单个查看shp文件的属性进行汇总过于繁琐&#xff0c;因此可以借助建模批处理来计算。 首先准备数据&#xff1a;一个含有多个shp的文件夹。…

C++ Qt开发:SqlRelationalTable关联表组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍SqlRelationalTable关联表组件的常用方法及灵…