80.动态申请内存

目录

一.malloc函数

二.其他注意事项

三.视频教程


在定义变量的时候会在内存中申请空间。除了在定义变量的时候申请内存空间,也可以使用库函数动态申请内存,

一.malloc函数

作用:动态申请一块连续的任意尺寸的内存空间。

函数原型:void *malloc(size_t size);

头文件:#include <stdlib.h>

为什么返回值void *,可以他可以被转换成任意类型的指针。

函数返回值:成功返回指向申请完的内存空间的指针,失败返回NULL。

举例:


#include <stdio.h>
#include <stdlib.h>


int main(void)
{
    int *p;

    p = (int *)malloc(sizeof(int));
    if(p == NULL){
        printf("malloc error\n");
        return -1;
    }
    printf("Please enter an int type of data\n");
    scanf("%d",p);
    printf("data is %d\n",*p);
    free(p);

    return 0;

}

运行结果:

需要注意的是,malloc函数必须和free函数成对出现。

函数原型:

void free(void *ptr);

作用:释放ptr指向的内存空间。这个空间必须由malloc,calloc,realloc函数申请。realloc和calloc也是动态申请内存的函数,这里不做介绍。

也就是说必须使用free函数释放内存,否则会发生内存泄漏。

发生内存泄漏的例子:

#include <stdio.h>
#include <stdlib.h>


int main(void)
{
    int *p;

    while (1)
    {
        p = (int *)malloc(sizeof(int));
        if(p == NULL){
            printf("malloc error\n");
            return -1;
        }
    }
    
    return 0;

}

如果运行,等内存全部使用完毕,系统会自动kill掉该程序。甚至在运行过程中,一些性能不好的电脑会卡住。运行结果:

二.其他注意事项

1.也可以这样使用申请任意大小的空间:(指针类型*)malloc(sizeof(指针类型)*数据数量)

三.视频教程

79.动态申请内存_哔哩哔哩_bilibili

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会为你画出内存分配和回收的过程。下面是首次适应算法分配内存的过程: 初始状态,内存空间为640KB,低端40KB用来存放OS。 | 空闲分区号 | 起始地址 | 分区大小 | | ---------- | -------- | -------- | | 1 | 40KB | 600KB | 作业1申请200KB,分配编号为1。 | 空闲分区号 | 起始地址 | 分区大小 | | ---------- | -------- | -------- | | | 40KB | 200KB | | 2 | 240KB | 400KB | 作业2申请70KB,分配编号为2。 | 空闲分区号 | 起始地址 | 分区大小 | | ---------- | -------- | -------- | | | 40KB | 200KB | | 3 | 310KB | 330KB | | 2 | 240KB | 70KB | | | 310KB | 330KB | 作业3申请150KB,分配编号为3。 | 空闲分区号 | 起始地址 | 分区大小 | | ---------- | -------- | -------- | | | 40KB | 200KB | | 4 | 460KB | 170KB | | 3 | 310KB | 150KB | | 2 | 240KB | 70KB | | | 460KB | 170KB | 作业2释放70KB,回收分区2。 | 空闲分区号 | 起始地址 | 分区大小 | | ---------- | -------- | -------- | | | 40KB | 200KB | | 2 | 240KB | 70KB | | 4 | 310KB | 150KB | | 3 | 460KB | 170KB | | | 630KB | 10KB | 作业4申请80KB,分配编号为2。 | 空闲分区号 | 起始地址 | 分区大小 | | ---------- | -------- | -------- | | | 40KB | 200KB | | 4 | 310KB | 150KB | | 3 | 460KB | 80KB | | 5 | 540KB | 90KB | | | 630KB | 10KB | 作业3释放150KB,回收分区3和5。 | 空闲分区号 | 起始地址 | 分区大小 | | ---------- | -------- | -------- | | | 40KB | 200KB | | 6 | 310KB | 150KB | | 4 | 460KB | 280KB | | | 540KB | 90KB | | | 630KB | 10KB | 作业5申请100KB,分配编号为3。 | 空闲分区号 | 起始地址 | 分区大小 | | ---------- | -------- | -------- | | | 40KB | 200KB | | 6 | 310KB | 150KB | | 4 | 460KB | 180KB | | 7 | 640KB | 50KB | 作业6申请60KB,分配编号为2。 | 空闲分区号 | 起始地址 | 分区大小 | | ---------- | -------- | -------- | | | 40KB | 200KB | | 6 | 310KB | 150KB | | 4 | 460KB | 80KB | | 8 | 540KB | 60KB | | 7 | 640KB | 50KB | 作业7申请50KB,分配编号为2。 | 空闲分区号 | 起始地址 | 分区大小 | | ---------- | -------- | -------- | | | 40KB | 200KB | | 6 | 310KB | 150KB | | 4 | 460KB | 80KB | | 9 | 520KB | 20KB | | 8 | 540KB | 60KB | | 7 | 640KB | 50KB | 作业6释放60KB,回收分区8。 | 空闲分区号 | 起始地址 | 分区大小 | | ---------- | -------- | -------- | | | 40KB | 200KB | | 6 | 310KB | 150KB | | 4 | 460KB | 80KB | | 10 | 540KB | 60KB | | 9 | 520KB | 20KB | | 7 | 640KB | 50KB | 最终内存映像如下: | 分配编号 | 起始地址 | 分区大小 | | -------- | -------- | -------- | | 1 | 40KB | 200KB | | 3 | 310KB | 150KB | | 2 | 460KB | 80KB | | 4 | 540KB | 80KB | | 7 | 640KB | 50KB | | 6 | 310KB | 150KB | | 9 | 520KB | 20KB | | 10 | 540KB | 60KB | 以上就是使用首次适应算法进行内存分配和回收后内存的最终映像。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值