东莞网页模板建站,建设开源社区网站什么意思,游戏推广员怎么做,企业网站模板包含什么目录
前提须知#xff1a;
malloc#xff1a;
大意#xff1a;
头文件#xff1a;
申请空间#xff1a;
判断是否申请成功#xff1a;
使用空间#xff1a; 结果#xff1a;
整体代码#xff1a; malloc申请的空间怎么回收呢?
注意事项#xff1a;
free:…目录
前提须知
malloc
大意
头文件
申请空间
判断是否申请成功
使用空间 结果
整体代码 malloc申请的空间怎么回收呢?
注意事项
free: 前提须知
为什么要有动态内存分配
我们已经掌握的内存开辟⽅式有
int val 20;//在栈空间上开辟四个字节
char arr[10] {0};//在栈空间上开辟10个字节的连续空间
上述开辟内存空间的特点——空间申请之后不容易调整或者说不能够进行调整且数组在申明的时候必须指定数组的⻓度数组空间⼀旦确定了⼤⼩不能调整。而就算是变长数组也只是说数组的大小可以使用变量来指定而一旦数组创建好后依然是不能调整大小。而对于申请的空间大小不能灵活的调整C语言就给了: 动态内存管理给程序员权限自己申请自己使用使用完后自己释放。
而开辟和释放所需要用到的函数就是malloc与free
malloc是用来申请内存的free是用来释放内存的 malloc
C语⾔提供了⼀个动态内存开辟的函数 void* malloc (size_t size);大意
想要多少字节就向内存申请多少个字节 申请成功后会返回一共空间的起始地址开辟失败会返回空指针NULL。
头文件
#include stdlib.h
申请空间
malloc(10 * sizeof(int));
//申请10个整型的空间 - 40个字节
判断是否申请成功
if (p NULL)
{perror(malloc);return 1;
}冷知识return 0 表示一共主函数的结束也表示着一个正确的返回值而在此时的return 1表示的是一个返回失败的意思或是说申请空间失败。return 1也可以用return 2或者return 3表示只要表示return 0就行。 因为申请成功会返回起始地址而返回的类型是void*所以我们要进行使用的时候需要进行转化且我们要使用这个空间时得找一个相对因的变量指针进行存放空间起始地址。
int *p (int*)malloc(10 * sizeof(int));
使用空间
int i 0;
for (i 0; i 10; i)
{*(p i) i;
}for (i 0;i 10; i)
{ printf(%dp[i]);return 0;
} pi表示地址*pi表示地址所指向的元素所以这是给每个不同地址的不同的元素赋值。p[i]相当于*pi 结果 整体代码
int main()
{int *p (int*)malloc(10 * sizeof(int));if (p NULL){perror(malloc);return 1;}int i 0;for (i 0; i 10; i){*(p i) i;}for (i 0;i 10; i){ printf(%dp[i]);return 0;}return 0;
} malloc申请的空间怎么回收呢?
free回收自己使用free不释放的时候程序结束后也会由操作系统回收malloc是堆区上申请内存 注意事项
如果开辟成功则返回⼀个指向开辟好空间的指针。 如果开辟失败则返回⼀个 NULL 指针因此malloc的返回值⼀定要做检查。 返回值的类型是 void* 所以malloc函数并不知道开辟空间的类型具体在使⽤的时候使⽤者⾃⼰来决定。 尽量使用free函数进行回收函数如若使用系统回收若申请的空间过大或进行多次申请空间且不使用free进行回收系统内存空间可能会出现不够如果参数 size 为0malloc的⾏为是标准是未定义的取决于编译器。 free:
C语⾔提供了另外⼀个函数free专⻔是⽤来做动态内存的释放和回收的函数原型如下
void free (void* ptr);free函数 只能 ⽤来释放动态开辟的内存。
如果参数 ptr 指向的空间不是动态开辟的那free函数的⾏为是未定义的。如果参数 ptr 是NULL指针则函数什么事都不做。malloc和free都声明在 stdlib.h 头⽂件中。
int main()
{int *p (int*)malloc(10 * sizeof(int));if (p NULL){perror(malloc);return 1;}int i 0;for (i 0; i 10; i){*(p i) i;}for (i 0;i 10; i){ printf(%dp[i]);return 0;}free(p);//释放p NULL;return 0;
} free(p); p NULL; p内存放的是申请的空间的起始位置。而free只是把p指向的空间回收了。而对于以上两段代码我们还得让p指针忘记申请空间的空间起始地址不然p会变成野指针。