动态申请内存与静态申请内存的区别:参考该文。 //静态的数组,数组长度是固定的,动态的数组,数组长度是可以任意的,即:可以通过函数传参的形式确定数组长度。
malloc与calloc的区别参考该文。
用到四个函数:--alloc是allocate分配的意思。
#include <stdlib>
malloc 、calloc 、realloc、free.
void *malloc(size_t size);
void *realloc(void *ptr,size_t size);
void *calloc(size_t nmemb,size_t size);
void free(void *ptr);
使用的的时候,可以不必将void*强转成对应的指针类型,如int*,因为void*是个百搭类型(除了赋值给函数指针外,C99中没有定义)
即:int *p = malloc(sizeof(int)*3);//假设sizeof(int)==4,则函数的意思是,申请连续的12个字节的内存单元。赋值给int*,只不过表示的是,我是按照int的大小每次来取数的。
当我们没有强转时,编译时会有警告,这是因为我们没有包含该函数的头文件,
在未包含头文件的情况下,函数返回值默认是int,int与指针类型不同,故会报警告。
原则:谁申请谁释放。
释放的原因是为了防止内存泄露,如果忘记free了,虽然当进程退出后,也会将申请的内存释放掉,但是如果进程长期运行,不断的申请内存而不释放内存,会出问题。
指针动态初始化:
int *p = (int*)malloc(sizeof(int)*3);//初始化为指向3个元素的数组
if(!p) exit -1;//这个地方一定要进行判断,因为若动态初始化不成功,在使用p[0]、p[1]、p[2]时报错。
指针的销毁:
free(p);
p = NULL;//避免p为野指针,需要赋值为NULL
//p中的值仍为原先的内存地址,此时要进行赋值NULL。
//释放内存后,赋值为NULL的好处还有:当p为NULL时,即便再free n次也不会出错!!!
注意:free的含义:free之后,是想将由malloc分配的内存交还给系统支配,而非代码支配,即由malloc分配的内存中内容由系统进行处理。
其中存在两个值:
一个是指针的值,指针的值并未发生改变,还是原先指向malloc分配的地址。
另一个是malloc分配的内存中的数据值,这其中的值取决于系统有没有使用该内存,如果使用了,该内存中的值会发生改变,如果没有使用,则还是保持原先的值。
//initList函数中形参的形式是取引用,是因为实参未初始化,未初始化的实参传递时,形参必须时对应的指针或引用
//destroyList函数中形参的形式仍然为取引用,是因为我们想将实参置为NULL,因为倘若仅传递指针的话,指针释放掉形参(实参)所对应的内存空间,并不能将实参置为空,而只是将函数中的形参置为空了,实参仍为野指针。