C库函数:stdlib.h-创新互联

stdlib.h

| 菜鸟教程 (runoob.com)">C 标准库 –| 菜鸟教程 (runoob.com)

创新互联是一家集网站建设,武强企业网站建设,武强品牌网站建设,网站定制,武强网站建设报价,网络营销,网络优化,武强网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

该库主要涉及“字符串和其他类型数据的转换”、“内存空间的申请和释放”、“查找和排序”、随机数等功能函数。

7void *calloc(size_t nitems, size_t size)
分配所需的内存空间,并返回一个指向它的指针。

malloc 和 calloc 之间的不同点是,malloc 不会设置内存为零,而 calloc 会设置分配的内存为零。

参数

  • nitems -- 要被分配的元素个数。
  • size -- 元素的大小。

返回值

该函数返回一个指针,指向已分配的内存(一块连续的内存空间)。如果请求失败,则返回 NULL。

注意:calloc出来的指针,可以按照数组的形式去访问。此时该指针就相当于数组名。

#include#includeint main()
{
    int *a;
	
    a = (int*)calloc(5, sizeof(int));
	
	a[0] = 1;
	a[1] = 10;
	
	printf("result is: %d\n", a[1]);
	printf("result is: %d\n", *a);
   
    free (a);  // 释放内存
    return(0);
}

运行结果如下:

8void free(void *ptr)
释放之前调用 calloc、malloc或 realloc所分配的内存空间。

9void *malloc(size_t size)
分配所需的内存空间,并返回一个指向它的指针。

参数

  • size -- 内存块的大小,以字节为单位。

返回值

该函数返回一个指针 ,指向已分配大小的内存。如果请求失败,则返回 NULL。

10void *realloc(void *ptr, size_t size)
尝试重新调整之前调用 malloc或 calloc所分配的 ptr 所指向的内存块的大小。

参数

  • ptr -- 指针指向一个要重新分配内存的内存块,该内存块之前是通过调用 malloc、calloc 或 realloc 进行分配内存的。如果为空指针,则会分配一个新的内存块,且函数返回一个指向它的指针。
  • size -- 内存块的新的大小,以字节为单位。如果大小为 0,且 ptr 指向一个已存在的内存块,则 ptr 所指向的内存块会被释放,并返回一个空指针。

返回值

该函数返回一个指针 ,指向重新分配大小的内存。如果请求失败,则返回 NULL。

11void abort(void)
使一个异常程序终止。

中止程序执行,直接从调用的地方跳出。 

13void exit(int status)
使程序正常终止。
  • status -- 返回给父进程的状态值。

16void *bsearch(const void *key, const void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *))
执行二分查找。

参数

  • key -- 指向要查找的元素的指针,类型转换为 void*。
  • base -- 指向进行查找的数组的第一个对象的指针,类型转换为 void*。
  • nitems -- base 所指向的数组中元素的个数。
  • size -- 数组中每个元素的大小,以字节为单位。
  • compar -- 用来比较两个元素的函数。

返回值

如果查找成功,该函数返回一个指向数组中匹配元素的指针,否则返回空指针。

17void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
数组排序。

参数

  • base -- 指向要排序的数组的第一个元素的指针。
  • nitems -- 由 base 指向的数组中元素的个数。
  • size -- 数组中每个元素的大小,以字节为单位。
  • compar -- 用来比较两个元素的函数。

返回值

该函数不返回任何值。

18int abs(int x)
返回 x 的绝对值。

22int rand(void)
返回一个范围在 0 到 RAND_MAX之间的伪随机数。
23void srand(unsigned int seed)
该函数播种由函数 rand 使用的随机数发生器。

返回一个范围在 0 到 RAND_MAX之间的伪随机数。 

4RAND_MAX
这个宏是 rand 函数返回的大值。

RAND_MAX 是一个常量,它的默认值在不同的实现中会有所不同,但是值至少是 32767。

在实际编程中,我们也不需要知道 RAND_MAX 的具体值,把它当做一个很大的数来对待即可。

rand函数的用法,在确定的范围内生成平凡的伪随机数,如下表示例:

v1 = rand() % 100v1 取值范围 0~99
v2 = rand() % 100 + 1v2 取值范围 1~100
v3 = rand() % 30 + 1985v3 取值范围 1985~2014

发现一个问题,多次执行rand函数,得到的随机数都是一样的。

在C语言中,rand函数可以用来产生随机数,但并不是真正意义上的随机数。它是返回介于 0 和 RAND_ MAX 之间的伪随机整数。

这个数字是由一个算法生成的,该算法每次调用它时都返回一个显然不相关的数字序列。该算法是使用一个种子来生成序列,当计算机正常开机后,这个种子的值是固定的,因此产生的伪随机整数也是固定的,除非你为了改变这个值破坏了系统。

为了使得初始化的值不同,C语言提供了srand函数。
如果你在第一次调用rand()之前没有调用srand(),那么系统会为你自动调用srand()。而使用同种子(相同的数)调用rand()会导致相同的随机数序列被生成。

rand函数每次调用前都会查询是否调用过srand(seed),是否给seed设定了一个值,如果没有,种子的值就默认为1,直接用 1 来初始化种子,那生成的随机数每次就会重复,为了防止生成的随机数重复,一般使用时间戳作为时间种子,采用系统时间来初始化,使用time函数来获得系统时间,它的返回值为从 00:00:00 GMT, January 1, 1970 到现在所持续的秒数,然后将time_t型数据转化为(unsigned)型再传给srand函数。

注意事项:

在这里插入图片描述
如果我们两次调用srand函数设置随机数种子之间的时间间隔不超过1s,这会导致我们重置随机数种子,从而等价于使用了一个固定的随机数种子。那么这两次调用最后生成的随机数就是相同的。
所以,一定不要将srand写在生成随机数的循环中(计算机一条指令的运行时间远远小于1s)~

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


本文标题:C库函数:stdlib.h-创新互联
标题路径:http://myzitong.com/article/cepgij.html