第十二章(2)——内存管理、随机数

本文部分参考https://blog.csdn.net/fireflylane/article/details/83660791

分配内存malloc()和free()

定义在stdlib.h中
malloc()函数接收一个参数:所需要的内存字节数
该函数会自动找到合适的空闲内存块,这样的内存是匿名的,即malloc()分配内存,但是不会为其赋名,它返回动态分配内存块的首字节的地址。

double *ptd;
ptd=(double *) malloc(30*sizeof(double));

malloc()可能分配不到所需要的内存,这种情况下,该函数返回空指针,可以调用exit函数结束程序,标准提供了两个返回函数,EXIT_SUCCESS表示普通的程序结束,EXIT_FAILURE表示程序异常中止

free()函数
该函数释放malloc()分配的内存,free()参数针,指向由malloc()分配的一块内存

malloc()与free要配套使用,不然当程序执行完,变量被销毁,从而申请的空间无法访问,就会发生内存泄漏

calloc()函数
接收两个无符号整数作为参数,第一个参数是所需的存储单元数量,第2个参数是存储单元的大小(以字节为单位)
与malloc()的区别
calloc()函数分配的内存会将所有的位置为0,而malloc是随机垃圾数据,不初始化
变长数组申请的空间会被自动释放,不必使用free

volatile类型界定符
告知计算机,代理(而不是程序所在的程序)可以改变该变量的值,通常,它被用于硬件地址以及在其他程序或同时运行的线程中共享数据。

restrict类型界定符
允许编译器优化某部分代码以更好地支持计算,它只能用于指针,表明该指针是访问数据对象的唯一且初始的方式

_Atominc类型界定符

随机函数

把文件放在双引号中而不是尖括号中,指示编译器在本地查找文件,而不是在编译器存放标准头文件的位置去查找文件

/*这是一个模拟掷色子1800次的程序*/
#include 
#include 
int main() 
{   int i;
    srand((unsigned)time(0)); 
    for (i=0;i<1800;i++)   printf("%d\n",rand()%6+1);
    return 0; 
}

库函数中系统提供了两个函数用于产生随机数:srand()和rand()。 原型为:
函数一:int rand(void);
返回一个[0,RAND_MAX]间的随机整数。
函数二:void srand(unsigned seed);
参数seed是srand()的种子,用来初始化srand()的起始值。
系统在调用rand()之前都会自动调用srand(),如果在srand()里给参数seed指定了一个值(这里指定的值是当前时间),那么 rand()就会将seed的值作为产生伪随机数的初始值;而如果用户在rand()前没有调用过srand(),那么系统默认将1作为伪随机数的初始值,如果初始值是此时的1或是其他定值,那么每次rand()产生的随机数序列都是一样的,这也就是所谓的“伪随机数”。

为了确保生成的随机数为尽可能符合概率上的随机,需要调用一个函数time() (是指返回自 Unix 纪元(January 1 1970 00:00:00 GMT)起的当前时间的秒数的函数,主要用来获取当前的系统时间,返回的结果是一个time_t类型),这个函数包含在头文件time.h里,在生成随机数的调用下需强制类型转换为(unsigned)time(),后面一个括号中必须填入(unsigned)time(NULL)或(unsigned)time(0)。

你可能感兴趣的:(c语言编程相关)