33.fgets()
scanf() //缺点:不可以接收空格,且能越界接收。
gets() //优点:可以接收空格 缺点:不安全,如果数组长度为50,输入了50个字符,那么会全部存入,没有空间存放字符结束符。且能越界接收。
fgets() //是一个安全的字符串接收函数,如果数组长度为50,只能接收49个字符,最后一个存入字符结束符\0, 缺点是如果输入长度未达到数组长度,fgets讲接收空格\n
34.const是一个类型修饰符,使用const修饰变量可以使它的值不可改变
使用的地方:修饰变量,修饰指针
修饰指针时,int const *p = &a 指向可以改变,指向的值不能改变;
int * const p = &a 指向不可以改变,指向的值可以改变
const int *p = &a 指向和指都不可以改变
35.内存管理
①从分配方式来看,可以分为3种:
1)静态分配:从静态存储区分配,内存在编译时已分配完成,这块内存在整个程序运行期间都会存在。例如全局变量,static变量;
2)在栈上创建,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存非陪运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
3)从堆上分配,亦称为动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
②内存分区
1)BBS段:通常是指用来存放层序中未初始化的全局变量和静态变量
2)数据段:通常时用来存放程序中已初始化的全局变量和静态变量的一块内存区域。数据段属于静态内存分配,可以氛围只读数据段和读写数据段。字符串常量等,但一般都是放在只读数据段中。
3)代码段:通常是用来存放程序执行代码的一块内存区域。
4)堆:堆时用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到对上;当利用free等函数释放内存时,被释放的内存从堆中被删除;
5)栈:栈又成为堆栈,是用户存放程序临时创建的局部变量,也就是我们说的{}中定义的变量。除此之外,在函数被调用的时候,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中,由于栈的先进先出特点,所以,栈特别方便用来保存/回复调用现场。从这个意义上来讲,我们可以吧堆栈看成一个寄存、交换临时数据的内存区。
36.malloc
①格式:void *malloc(unsigned size);
从内从的堆区分配一块大小为size个字节的连续内存空间,如果内存分配成功,返回内存的首地址,失败的话返回null。
②注意:如果申请了内存,没有赋值,里面存的时垃圾数,不一定全部是0。
37.calloc
①格式:calloc(块数,长度; calloc(4,sizeof(int)); //分配了四块,长度为4的内存空间,他们的地址也是连续的。
②注意:calloc可以帮我们把存储空间初始化为0,而malloc不会。
38.realloc
①格式:realloc(p,40*sizeof(int)); //帮我们扩充已存在的存储空间,如果原地址下不够扩充的长度,那就换一个地址返回;如果原地址下够扩充,那就直接连接。
39.free
free(p); //使用free函数释放内存空间