在C语言中,我们开辟内存的方式有两种
1.静态开辟内存
2.动态开辟内存
静态例:
int a[10] = {0} ;
我们这里定义的数组所开辟的内存是在栈区中开辟的,数组a指定为40个字节 ,这种分配固定大小的内存分配称为静态内存分配。
在很多时候,我们申请的空间是未知的
比如说通讯录,我们不知道需要存下多少个号码,这时候就存在一个问题,你定的空间需要多少个字节,当申请的太少,就会出现存不下去的情况,如果存的空间过大,有会造成空间的浪费。
而动态内存分配的空间是在堆区申请的,可以控制内存的分配的。两者互有利弊,具体要看所需情况使用~
这里补充一个知识:
内存在使用内存的时候,会划分出不同的功能区域:栈区、堆区、静态区
下面简单画个草图方便大家理解
void* malloc (size_t size);
头文件都是#include
上面是malloc的英文文档,笔者平时看的比较少,但是很建议大家多去看看
下面用中文来解释一下:
1.malloc()函数会向堆中申请一片可用的内存块,若申请成功则返回指向该块开头的指针
2.若申请失败,则会返回NULL空指针, 所以我们在用malloc()函数开辟动态内存之后, 一定要判断函数返回值是否为空.
3.返回值的类型为void*,可强制转化成我们所需类型 如: (int*)malloc(sizeof(int)*n)。
4.如果size为0, 这是未定义的, 会发生未知错误, 可能为空也可能不为空,取决于编译器
例(指针自身 = (指针类型*)malloc(sizeof(指针类型)*数据数量)
int *p = NULL;
int n = 50;//此处n可以改成由用户输入任意数字
p = (int *)malloc(sizeof(int)*n);
作用:释放malloc(或calloc、realloc)函数给指针变量分配的内存空间。(如果我们不手动释放, 直到程序运行结束才会释放, 这样就可能会造成内存泄漏,我们申请的动态内存不再使用时 ,一定要及时释放)
注:使用后该指针变量一定要重新指向NULL且不能重复释放
否则会出现内存错误。
int *p = (int *)malloc(sizeof(int));
*p = 100;
free(p);
p = NULL;
void * calloc(size_t num,size_t size)
这里我就不放英文文档了,有兴趣的铁汁们可以下去自己查阅。
calloc()与malloc()函数的区别只在于, calloc()函数会在返回地址之前将其所有位初始化为零,而malloc不初始化,里边数据是随机的垃圾数据.
calloc()函数功能是动态分配num个大小(字节长度)为size的内存空间
void * realloc(void * ptr,size_t size)
realloc() 函数就可以对动态开辟内存大小进行调整(可大可小)
1.ptr为需要调整的内存地址
2.size为调整后需要的字节数
3.若调整完成, 指向调整后内存的指针, 若失败,则返回NULL。
4.如果ptr是空指针, 会发生未知错误, 可能为空也可能不为空,取决于编译器
第一种情况地址不变。第二种是在新地址申请空间,地址改变。
若不成功,ptr 所指内存不会被释放, 函数返回NULL
例
以上就是对动态内存分配的几个函数的解释和运用,这些在通讯录以及链表中都有用到。若有错误和不足之处请铁汁们指出
最后祝大家学有所成!再见咯大家~