坑边闲话stdlib.h 是很多 C 语言的初学者第二个接触到的头文件。该头文件非常重要,学习该文件,可以省下很多功夫。大多数谭浩强老师的读者,在学完了 malloc 函数之后,就对这个文件知之甚少了。今天我来把其中的所有函数,给大家简单介绍一下。

我曾经自己动手写过一个从一串字符里提取浮点数的算法,GitHub 链接

后来我才知道,stdlib.h 里面已经定义了一个函数,可以通过这个库函数让我的代码更加精简(当然,它的功能很基础,丰富性不如我的代码)。

工欲善其事,必先利其器。了解库函数是入门第一步;了解所有库,是高手第一步。

1. 关键库函数介绍·

1.1 函数名称 calloc·

函数原型:void calloc(unsigned n, unsigned size);

函数功能:分配 n 个数据项的内存连续空间,每个数据项的大小为 size.

函数返回:分配内存单元的起始地址,如果不成功,返回 0.

1.2 函数名称 free·

函数原型:void free(void* p);

函数功能:释放 p 所指的内存区

函数返回:无返回值

参数说明:p 是被释放的指针。

1.3 函数名称:malloc·

函数原型:void * malloc(unsigned size);

函数功能:分配 size 字节的存储区

函数返回:所分配的内存区地址,如果内存不够,返回 0

1.4 函数名称:realloc·

函数原型:void * realloc(void * p, unsigned size);

函数功能:将 p 所指出的已分配内存区的大小改为 size, size 可以比原来分配的空间大或小

函数返回:返回指向该内存区的指针。NULL 表示分配失败。

1.5 函数名称:rand·

函数原型:int rand(void);

函数功能:产生 032767 间的随机整数(00x7fff 之间)

函数返回:随机整数。

1.6 函数名称:abort·

函数原型:void abort(void)

函数功能:异常终止一个进程。

1.7 函数名称:exit·

函数原型:void exit(int state);

函数功能:程序中止执行,返回调用过程。

函数返回:

参数说明:

  • state:
    • 0 正常中止
    • 0 非正常中止

1.8 函数名称:getenv·

函数原型:char* getenv(const char *name)

函数功能:返回一个指向环境变量的指针

函数返回:环境变量的定义

参数说明:name 是环境字符串

1.9 函数名称:putenv·

函数原型:int putenv(const char *name)

函数功能:将字符串 name 增加到 DOS 环境变量中。

函数返回:

  • 0 操作成功
  • -1 操作失败

参数说明:name-环境字符串

1.10 函数名称:labs·

函数原型:long labs(long num)

函数功能:求长整型参数的绝对值

函数返回:绝对值

1.11 函数名称:atof·

函数原型:double atof(char *str)

函数功能:将字符串转换成一个双精度数值

函数返回:转换后的数值

参数说明:str 待转换浮点型数的字符串

1.12 函数名称:atoi·

函数原型:int atoi(char *str)

函数功能:将字符串转换成一个整数值

函数返回:转换后的数值

参数说明:str- 待转换为整型数的字符串

1.13 函数名称: atol·

函数原型:long atol(char *str)

函数功能:将字符串转换成一个长整数

函数返回:转换后的数值

参数说明:str- 待转换为长整型的字符串

1.14 函数名称: ecvt·

函数原型:char *ecvt(double value, int ndigit, int *dec, int *sign)

函数功能:将浮点数转换为字符串

函数返回:转换后的字符串指针

参数说明:

  • value:待转换底浮点数
  • ndigit:转换后的字符串长度

1.15 函数名称:fcvt·

函数原型:char *fcvt(double value, int ndigit, int *dec, int *sign)

函数功能:将浮点数变成一个字符串

函数返回:转换后字符串指针

参数说明:

  • value,待转换底浮点数
  • ndigit,转换后底字符串长度

2. 能力提升·

如此一来,大家可以通过这个代码片段了解一下 stdlib.h 里面的函数怎么用。其实非常简单。我写这篇文章的主要目的就是告诉大家,在学习一门语言的过程中,最最重要的就是了解前人已经把哪些工作做完(并且公认做到了最高效率),然后掌握这些方法。C/C++ 如此,Java、Python 更是如此。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/*
* FILE NAME: test_stdlib.c
* AUTHOR: Liu Peng
* DATE: 2019-03-17
* COPYRIGHT: You can do anything without permission.
*/

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char* argv[]) {
char *B = "PATH";
B = getenv(B);
puts(B);

char *A = "ILOVEU";
puts(A);
int a = putenv(A);
printf("a = %d\n", a);

long m = -10000;
printf("|m| = %ld\n", labs(m));

char *n = "3.14159265";
double pi = atof(n);
printf("pi = %1.8f\n", pi);


return 0;
}