malloc函数:
这是在堆区上开辟空间的函数 头文件为stdlib.h
根据这张图片我们可以知道 malloc函数的参数是 字节 返回类型是void * 类型 还知道这个函数开辟空间返回的是这块空间的起始地址 如果开辟空间失败 就会返回 NULL指针
所以我们在使用这个函数的时候如果没有对这个函数的返回类型做检查 那么编译器会报错 说malloc函数返回的指针可能为空 虽说这个错误是无关紧要的 没有这个错误程序也能运行 但谁也说不准它会不会开辟失败 所以还是严谨点要好
如果说参数 为0 那么malloc的行为是不确定的 这个的看编译器怎么办
int main() { int* p = (int*)malloc(5*sizeof(int));//这里强转是因为malloc返回的是void* 虽然有些编译器 if(p==NULL) //不转也行 但还是转一下会好一点 { printf("%s",strerror(errno)); //strerror字符串函数 在我之前的文章 字符串操作函数 } free(p); }
大家注意到我上面的代码 里面的free函数了吗 这个free函数是为了 将我们向内存申请的空间还回去 最后我们再来说这个
calloc函数:
这个和malloc函数相差不大 唯一的不同就是 这个函数开辟空间后并把这份空间的内容初始
#include <stdio.h> #include <stdlib.h> int main() { int* p=(int*)calloc(5,sizeof(int)); for(int i=0;i<5;i++) { printf("%d ",p[i]); //打印出来的答案肯定是0 0 0 0 0 } }
所以calloc函数就没什么好说的了
realloc函数:
这个函数可用来调节我们开辟了的空间大小 也可以自己开辟一段空间
通过这张图我们可以知道 它的第一个参数是malloc calloc realloc所开辟空间的首地址 ,但是如果你传进去的参数是NULL话 那么realloc函数的作用和malloc函数的作用是一样的
我们知道realloc函数也会返回一个空间的地址 那我们返回的地址应该放在哪里呢 ?是放在被重新分配大小的空间呢? 还是一份新的空间呢?
这个是第一种情况 我们开辟的空间后面有足够的空间 就直接在后面开辟空间返回的地址与之前相同 如果开辟失败返回NULL
这个是第二种情况后面的空间不足 则realloc会开辟一块新的空间 并把原来空间的数据拷进去同时把原来的空间释放掉 返回新空间的首地址 一样的开辟失败 还是会返回NULL
所以综合以上的两种情况我们平常在开辟空间的时候要注意开辟空间返回地址的检查 vs编译器就会这样 如果你没有对它检查就会报错 所以说这个看个人习惯 毕竟开辟失败的概率较小
free函数:
free函数是将 我们申请的空间还回去(释放掉)
有个要注意的点是 看下面的代码:>
#include <stdio.h> int main() { int* p=(int*)malloc(10*sizeof(int));//开辟十个int空间 for(int i=0;i<5;i++) { *p=i; p++; } free(p); }
大家觉得这里的 free 能把开辟的空间 free 掉嘛?
当然答案是肯定不能的 这串代码中我们开辟的空间返回的首地址放在p里面 在后面的for循环中 我们对前面五个空间 赋值 1 2 3 4 5 这个时候p指向第六个空间
这个时候是不能free掉的 我们开辟的空间是不能够free一部分的 所以我们开辟的空间返回的地址是一定要记住的
还有几个要注意的点:
① free不能free两遍
② 不能free不是动态内存的值
③ 动态开辟的内存要记得 free 掉 不然会造成内存泄漏