从零开始学习c语言|21、动态内存管理

一、malloc函数

1、什么是malloc函数

malloc是memery(内存)和allocate(分配)的缩写,顾名思义,malloc函数为动态分配内存的意思 

2、malloc函数语句

int *p=(int *)malloc(sizeof(int))
malloc函数的形参为申请的内存空间大小,上述申请了一个int型数据的大小
malloc函数的返回值是这一块内存空间的首地址,上述代码即是将指针变量p指向这动态申请内存的
		首地址。
(*int)强制类型转换,即将该返回的地址类型强制转换为一个整型变量的地址,也就是说p和p+1相差
一个整型大小。
上述代码一个申请了12个字节的内存大小,p变量占8个字节(与cpu的大小有关),
p指向的内存为4个字节。
p本身的内存是静态分配的,p指向的内存是动态分配的
free(p)把p指向的内存释放掉,而p本身的内存只能由程序执行完毕,系统自动释放

3、malloc函数的用法

int *parry=(int *)malloc(sizeof(int*5);
动态申请5个整型变量大小的内存,即20个字节,parry指针变量指向的是该内存的首地址,
int * 表示该指针变量只能指向int型变量的地址,故parry等价于指向前4个字节,
*parry等价于parry[0];
#include <stdio.h>
#include <malloc.h>
int main()
{
    int *parry = (int *)malloc(sizeof(int) * 5);
    for (int i = 0; i < 5; i++)
    {
        printf("请输入%d个元素的值\n", i + 1);
        scanf("%d", &parry[i]);
    }
    for (int i = 0; i < 5; i++)
    {
        printf("第%d的值为 %d \n", i + 1, parry[i]);
    }
    return 0;
}

在这里插入图片描述

创建动态数组的好处

  • 1、动态的决定数组的大小
  • 2、数组可以由程序员动态的创建和释放
  • 3、数组可跨函数使用

4、初始化内存空间

以mem开头的函数被编入字符串标准库,函数的声明包含在头文件string.h中
  • memset:使用一个常量字节填充内存空间
  • memcpy:拷贝内存空间
  • memmov:拷贝内存空间
  • memcmp:比较内存空间
  • memchar:在内存空间搜索一个字符
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    int *parry = (int *)malloc(sizeof(int) * 5);
    if (parry == NULL)
    {
        exit(-1);
    }
    memset(parry, 0, sizeof(int) * 5);

    for (int i = 0; i < 5; i++)
    {
        printf("%d ", parry[i]);
    }
    free(parry);
    return 0;
}

在这里插入图片描述

二、calloc函数
动态申请内存空间,并对其初始化
int *p=(int*)calloc(4,sizeof(int));

上述语句等价于

int *p=(int*)malloc(4*sizeof(int));
memset=(p,0,4*sizeof(int));
三、realloc函数
重新分配内存空间
int *ptr=NULL;
ptr = (int *)realloc(ptr, sizeof(int));//返回新的内存地址给ptr,ptr原本的值保存在新的内存空间
编写代码:让用户任意输入整数,输入一个整数,就动态添加一个内存空间,直到用户输入-1为止
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    int num = 0;
    int i = 0;
    int *ptr = (int *)malloc(sizeof(int));
    if (ptr == NULL)
    {
        exit(-1);
    }
    while (1)
    {
        printf("请用户输入想要录入的数,输入-1跳出程序\n");
        scanf("%d", &num);
        if (num == -1)
            break;
        ptr[i] = num;
        i++;
        ptr = (int *)realloc(ptr, sizeof(int) * (i + 1));
        if (ptr == NULL)
        {
            exit(-1);
        }
    }

    for (int j = 0; j < i; j++)
    {
        printf("%d ", ptr[j]);
    }
    free(ptr);
    return 0;
}

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值