malloc与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;
}

因为申请成功会返回起始地址,而返回的类型是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("%d",p[i]);
     return 0;
}
  • p+i表示地址,*(p+i)表示地址所指向的元素,所以这是给每个不同地址的不同的元素赋值。
  • p[i]相当于*(p+i)

结果:

整体代码:

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("%d",p[i]);
    return 0;
  }

     return 0;
}

malloc申请的空间怎么回收呢?

  1. free回收
  2. 自己不释放的时候,程序结束后,也会由操作系统回收
  3. malloc是堆区上申请内存

注意事项:

  • 如果开辟成功,则返回⼀个指向开辟好空间的指针。
  • 如果开辟失败,则返回⼀个 NULL 指针,因此malloc的返回值⼀定要做检查。
  • 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使⽤的时候使⽤者⾃ ⼰来决定。
  • 如果参数 size 为0,malloc的⾏为是标准是未定义的,取决于编译器。

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("%d",p[i]);
      return 0;
    }
       free(p);//释放
       p = NULL;
       return 0;
    

    }

free(p);

p = NULL;

  • p内存放的是申请的空间的起始位置。
  • 而free只是把p指向的空间回收了。
  • 而对于以上两段代码我们还得让p指针忘记申请空间的空间起始地址,不然p会变成野指针。
相关推荐
hsling松子4 小时前
使用PaddleHub智能生成,献上浓情国庆福
人工智能·算法·机器学习·语言模型·paddlepaddle
dengqingrui1235 小时前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp
C++忠实粉丝5 小时前
前缀和(8)_矩阵区域和
数据结构·c++·线性代数·算法·矩阵
ZZZ_O^O5 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
CV-King6 小时前
opencv实战项目(三十):使用傅里叶变换进行图像边缘检测
人工智能·opencv·算法·计算机视觉
代码雕刻家6 小时前
数据结构-3.9.栈在递归中的应用
c语言·数据结构·算法
雨中rain6 小时前
算法 | 位运算(哈希思想)
算法
Kalika0-08 小时前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法
代码雕刻家8 小时前
课设实验-数据结构-单链表-文教文化用品品牌
c语言·开发语言·数据结构
龙图:会赢的8 小时前
[C语言]--编译和链接
c语言·开发语言