c 语言stdlib.h介绍

stdlib.h介绍

stdlib.h 是 C 语言的标准库头文件,它包含了许多与内存分配、随机数生成、字符串转换和其他常用函数相关的函数原型和宏定义。

内存管理函数

  • malloc():用于分配指定字节数的内存空间。
void* malloc(size_t size);

其中,size 参数表示要分配的内存大小(以字节为单位)。malloc 函数会尝试在堆上分配足够大小的内存块,并返回一个指向该内存块的指针。如果分配成功,则返回的指针是有效的;如果分配失败,则返回 NULL

#include <stdio.h>
#include <stdlib.h>int main() {int* ptr;int num_elements = 5;// 动态分配具有 5 个 int 元素的内存空间ptr = (int*)malloc(num_elements * sizeof(int));if (ptr != NULL) {// 分配成功,使用分配的内存空间for (int i = 0; i < num_elements; i++) {ptr[i] = i + 1;}// 打印数组元素for (int i = 0; i < num_elements; i++) {printf("%d ", ptr[i]);}// 释放内存空间free(ptr);} else {// 分配失败printf("内存分配失败\n");}return 0;
}
  • calloc():用于分配指定数量的元素,并将它们初始化为零。它类似于 malloc 函数,但在分配内存后会将分配的内存空间初始化为零值。
void* calloc(size_t num, size_t size);

其中,num 参数表示要分配的元素数量,size 参数表示每个元素的大小(以字节为单位)。calloc 函数会尝试在堆上分配足够大小的内存块,并将其初始化为零。然后,它会返回一个指向该内存块的指针。如果分配成功,则返回的指针是有效的;如果分配失败,则返回 NULL

#include <stdio.h>
#include <stdlib.h>int main() {int* ptr;int num_elements = 5;// 分配具有 5 个 int 元素的内存空间,并初始化为零ptr = (int*)calloc(num_elements, sizeof(int));if (ptr != NULL) {// 分配成功,使用分配的内存空间for (int i = 0; i < num_elements; i++) {printf("%d ", ptr[i]);}// 释放内存空间free(ptr);} else {// 分配失败printf("内存分配失败\n");}return 0;
}
  • realloc():用于重新分配已分配内存的大小。它可以修改之前由 malloccallocrealloc 分配的内存块的大小。
void* realloc(void* ptr, size_t size);

其中,ptr 是之前分配的内存块的指针,size 是重新分配的大小(以字节为单位)。realloc 函数会尝试重新分配大小为 size 的内存块,并返回一个指向新分配内存的指针。如果分配成功,则返回的指针是有效的;如果分配失败,则返回 NULL

#include <stdio.h>
#include <stdlib.h>int main() {int* ptr;int num_elements = 5;// 分配具有 5 个 int 元素的内存空间ptr = (int*)malloc(num_elements * sizeof(int));if (ptr != NULL) {// 分配成功,使用分配的内存空间for (int i = 0; i < num_elements; i++) {ptr[i] = i + 1;}// 打印数组元素for (int i = 0; i < num_elements; i++) {printf("%d ", ptr[i]);}// 重新分配内存大小为 10 个 int 元素int new_num_elements = 10;ptr = (int*)realloc(ptr, new_num_elements * sizeof(int));if (ptr != NULL) {// 重新分配成功,继续使用分配的内存空间for (int i = num_elements; i < new_num_elements; i++) {ptr[i] = i + 1;}// 打印重新分配后的数组元素for (int i = 0; i < new_num_elements; i++) {printf("%d ", ptr[i]);}} else {// 重新分配失败printf("内存重新分配失败\n");}// 释放内存空间free(ptr);} else {// 分配失败printf("内存分配失败\n");}return 0;
}
  • free():用于释放之前分配的内存空间。它用于将之前由 malloccallocrealloc 分配的内存返回给系统,以便供其他程序使用。
void free(void* ptr);

其中,ptr 是指向要释放的内存块的指针。通过调用 free 函数,可以将该内存块释放回系统。

#include <stdio.h>
#include <stdlib.h>int main() {int* ptr;int num_elements = 5;// 动态分配具有 5 个 int 元素的内存空间ptr = (int*)malloc(num_elements * sizeof(int));if (ptr != NULL) {// 分配成功,使用分配的内存空间for (int i = 0; i < num_elements; i++) {ptr[i] = i + 1;}// 打印数组元素for (int i = 0; i < num_elements; i++) {printf("%d ", ptr[i]);}// 释放内存空间free(ptr);} else {// 分配失败printf("内存分配失败\n");}return 0;
}

随机数函数

  • rand():生成一个伪随机数。它可以用于生成范围在 0RAND_MAX 之间的整数。
int rand(void);
#include <stdio.h>
#include <stdlib.h>
#include <time.h>int main() {// 设置随机数种子srand(time(NULL));// 生成随机数int random_number = rand();printf("随机数: %d\n", random_number);return 0;
}
  • srand():用于设置随机数生成器的种子。它作用于 rand 函数,可以通过设置不同的种子值来产生不同的伪随机数序列。
void srand(unsigned int seed);
#include <stdio.h>
#include <stdlib.h>
#include <time.h>int main() {// 设置随机数种子为固定值 42srand(42);// 生成随机数int random_number = rand();printf("随机数: %d\n", random_number);return 0;
}

在上述代码中,我们调用 srand(42) 来设置随机数种子为固定值 42。这意味着每次运行程序时,通过调用 rand 函数生成的随机数序列都是相同的。

字符串转换函数

  • atoi():将字符串转换为整数。atoi 函数会忽略字符串中的空白字符,然后将有效的数字部分转换为整数。
int atoi(const char* str);

其中,str 是一个以null 结尾的字符串,表示要转换为整数的输入字符串。

#include <stdio.h>
#include <stdlib.h>int main() {const char* str = "12345";int number = atoi(str);printf("转换后的整数: %d\n", number);return 0;
}

在上述代码中,我们将字符串 "12345" 赋给 str 变量,并使用 atoi 函数将其转换为整数。转换后的整数值存储在 number 变量中。
如果字符串无法转换为有效的整数,atoi 函数将返回 0。此外,atoi 函数没有提供错误检查机制,因此在使用 atoi 函数之前,应确保输入字符串符合要求,否则可能导致不可预测的结果。

  • atof():将字符串转换为浮点数。atof 函数会忽略字符串中的空白字符,然后将有效的数字部分转换为浮点数。
double atof(const char* str);

其中,str 是一个以 null 结尾的字符串,表示要转换为浮点数的输入字符串。

#include <stdio.h>
#include <stdlib.h>int main() {const char* str = "3.14";double number = atof(str);printf("转换后的浮点数: %f\n", number);return 0;
}

在上述代码中,我们将字符串"3.14"赋给 str 变量,并使用 atof 函数将其转换为浮点数。转换后的浮点数值存储在 number 变量中。
如果字符串无法转换为有效的浮点数,atof 函数将返回 0.0。此外,atof 函数没有提供错误检查机制,因此在使用 atof 函数之前,应确保输入字符串符合要求,否则可能导致不可预测的结果。

  • itoa():将整数转换为字符串。itoa 并不是标准库函数。itoa 是一个非标准的函数,它在某些编译器和库中提供,用于将整数转换为对应的字符串表示。
#include <stdio.h>int main() {int number = 12345;char str[20];sprintf(str, "%d", number);printf("转换后的字符串: %s\n", str);return 0;
}

在上述代码中,我们将整数 12345 赋给 number 变量,并声明一个足够大的字符数组 str 作为字符串缓冲区。

如果您需要更灵活和安全的整数转换到字符串的方法,可以考虑使用第三方库,如 libcurl glib 中提供的函数。

环境控制函数

  • system():是一个标准库函数,用于执行操作系统命令。它允许在程序中调用外部命令,并在操作系统中执行该命令。
int system(const char* command);

其中,command 是一个以 null 结尾的字符串,表示要执行的命令。

#include <stdio.h>
#include <stdlib.h>int main() {const char* command = "ls -l";int result = system(command);if (result == -1) {printf("命令执行失败\n");} else {printf("命令执行成功\n");}return 0;
}

我们将字符串 "ls -l" 赋给 command 变量,表示要执行的命令是列出当前目录的详细信息。

system 函数的使用可能因操作系统而异。在不同的操作系统上,system 函数可能有不同的行为和限制。此外,使用 system 函数时应注意潜在的安全风险,尤其是在接受用户输入的情况下,应避免直接将用户提供的字符串作为命令参数传递给 system 函数,以防止命令注入等安全问题。

其他函数

  • exit():用于终止程序的执行并返回到操作系统。
  • abs():返回一个整数的绝对值。
  • labs():返回一个长整数的绝对值。

此外,stdlib.h 还定义了一些宏,如 NULL(表示空指针)EXIT_SUCCESSEXIT_FAILURE(表示程序成功或失败的退出状态)。

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

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

相关文章

transform inverse()函数解析

transform inverse() const { const Quaternion rotation rotation_.conjugate(); const Vector translation -(rotation * translation_); return transform(translation, rotation); } 这段代码定义了一个inverse()成员函数&#xff0c;用于计算一个变换&#xff08;t…

pytorch之诗词生成5--train

先上代码&#xff1a; import tensorflow as tf from dataset import PoetryDataGenerator, poetry, tokenizer from model import model import settings import utilsclass Evaluate(tf.keras.callbacks.Callback):"""在每个epoch训练完成后&#xff0c;保留最…

将PostgreSQL插件移植到openGauss指导

1 概述 PostgreSQL 社区提供了丰富的插件&#xff0c;但由于 openGauss 和 PostgreSQL 存在一定的差异&#xff0c;如线程/进程模型、系统表和视图等&#xff0c;无法直接为 openGauss 所用&#xff0c;不可避免的需要在插件上做整改。 本文档主要对 Postgresql 插件移植到 o…

面试官:说说C++的引用和指针有什么区别

C中的引用和指针虽然都是用于间接访问和操作对象的工具&#xff0c;但它们之间存在几个重要的区别&#xff1a; 本质和存在性&#xff1a; 指针是一个变量&#xff0c;它存储了另一个变量的地址。指针有自己的内存地址&#xff0c;并且可以改变其指向的内容。 引用是一个别名&a…

springboot271制造装备物联及生产管理ERP系统

制造装备物联及生产管理ERP系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装制造装备物联及…

3月14日,每日信息差

&#x1f396; 素材来源官方媒体/网络新闻 &#x1f384; 5.5G通信网络在海南投入商用&#xff0c;较5G提升10倍 &#x1f30d; 国务院批复同意&#xff0c;珠海港口岸将整合并扩大开放 &#x1f30b; 同有科技&#xff1a;正在研究新型磁电存储技术 &#x1f381; 美国折扣零售…

考研模拟面试-答案【攻略】

考研模拟面试-答案【攻略】 前言版权推荐考研模拟面试-答案前面的问题通用问题专业题数据结构计算机网络操作系统数据库网络安全 手写题数据结构操作系统计算机网络 代码题基础代码题其他代码题 后面的问题补充题目 基础代码题答案链栈循环队列1循环队列2哈希表 最后 前言 202…

Oracle基础-分组查询 备份

一、概述 数据分组的目的是用来汇总数据或为整个分组显示单行的汇总信息&#xff0c;通常在查询结果集中使用GROUP BY 子句对记录进行分组。在SELECT 语句中&#xff0c;GROUP BY 子句位于FROM 子句之后&#xff0c;语法格式&#xff1a; SELECT columns_list FROM table_nam…

【测试知识】业务面试问答突击版1

高内聚低耦合 高内聚指的是将相关的功能或数据组织在一起&#xff0c;使得模块内部的各个元素紧密地联系在一起&#xff0c;完成特定的任务。 低耦合指的是模块之间的依赖关系尽可能地降低&#xff0c;模块之间的接口简单清晰&#xff0c;减少模块之间的相互影响。 文章目录 整…

【数据结构】二叉搜索树底层刨析

文章目录 1. 二叉搜索树的实现2. 二叉搜索树的应用3. 改造二叉搜索树为 KV 结构4. 二叉搜索树的性能分析 1. 二叉搜索树的实现 namespace key {template<class K>struct BSTreeNode{typedef BSTreeNode<K> Node;Node* _left;Node* _right;K _key;BSTreeNode(const…

工作中用到的 —— 工作总结提炼出来的股文

这里是目录 ---------------- VUE相关 -----------------1 - Vue3 是怎么得更快的&#xff1f;1-1 Fragment [frɡˈment]1-2 Suspense [səˈspens]1-3 Teleport [ˈtelipɔːt]1-4 v-memo 2- 说一下 Composition API3- 说一下 setup4- watch 和 watchEffect 的区别5- Vue3 响…

Sublime查看ANSI编码文档乱码问题

原因为没有安装对应的解码插件。 选择安装插件包 选择插件包&#xff1a;ConvertToUTF8或者GBK&#xff0c;我试了第一个插件包不行&#xff0c;安装GBK插件包后OK。

Git如何清除账户凭证

场景&#xff1a;一般发生在Git用户变更的情况 1.git base 操作 Git会使用凭证助手 credential.helper来储存账户凭证&#xff0c;通过以下命令移除&#xff1a; git config --system --unset credential.helper 除了system系统级外&#xff0c;还有 global、local范围。 查…

20万英文单词同义词宝典ACCESS\EXCEL数据库

英语同义词反义词的数据之前搞到过《近万英语单词同义词典ACCESS数据库》、《上百万英语同义反义词词典ACCESS数据库》&#xff0c;今天又搞到一份几十万行数据的&#xff0c;发上来看看有没有适合朋友们的需求。 今天这个数据提供了非常全的词汇单词以及词汇对应的含义以及近…

将Java项目Jar包制作成Docker镜像

文章目录 前言一、准备事项二、使用步骤1.Dockerfile脚本2.制作镜像推送Harbor仓库前言 以前单体项目通常采用传统部署方式将项目打成Jar包再进行部署。如果我们项目是微服务则需要进行Docker容器部署。本文将介绍如何在本地将Jar包制作成Docker镜像并推送到Harbor仓库 一、准…

Spring揭秘:ClassPathScanningProvider接口应用场景及实现原理!

技术应用场景 ClassPathScanningCandidateComponentProvider是Spring框架中一个非常核心的类&#xff0c;它主要用于在类路径下扫描并发现带有特定注解的组件&#xff0c;支持诸如ComponentScan、Component、Service、Repository和Controller等注解的自动扫描和注册。 ClassP…

Mysql 无法启动,mysql-bin.日志丢失删除处理

在linux操作系统中&#xff0c;当mysql无法启动时候&#xff0c;先看日志 2024-03-15T05:20:16.352075Z 0 [Warning] [MY-000081] [Server] option max_allowed_packet: unsigned value 107374182400 adjusted to 1073741824. 2024-03-15T05:20:16.352156Z 0 [Warning] [MY-010…

Marshmallow,一个有点甜的Python库

前言 在许多场景中&#xff0c;我们常常需要执行Python对象的序列化、反序列化操作。例如&#xff0c;在开发REST API时&#xff0c;或者在进行一些面向对象化的数据加载和保存时&#xff0c;这一功能经常派上用场。 经常cv Python代码的臭宝&#xff0c;接触最多的应该是通过…

验证与分享执行计划突变引发的问题

作者简介 张瑞远&#xff0c;曾经从事银行、证券数仓设计、开发、优化类工作&#xff0c;现主要从事电信级IT系统及数据库的规划设计、架构设计、运维实施、运维服务、故障处理、性能优化等工作。 持有Orale OCM,MySQL OCP及国产代表数据库认证。 获得的专业技能与认证包括 Oce…

被军训到的两天

1.gradle7.6.1 1.安装gradle7.6.1,一定要注意的是&#xff0c;使用的JDK是否能用&#xff0c;比如gradle7.6.1用的是JDK11。 2. F:/sofer....是Gradle自己的仓库地址&#xff0c;注意不能和maven使用一样的仓库。 使用specified location,可以避免下本项目的gradle版本&…