首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >动态内存管理申请调整和释放

动态内存管理申请调整和释放

作者头像
如烟花般绚烂却又稍纵即逝
发布于 2024-11-26 08:34:58
发布于 2024-11-26 08:34:58
8480
举报
文章被收录于专栏:javajava

动态内存管理存放在内存中的堆区中 动态内存分配的函数:malloc、calloc、realloc、free

malloc函数(内存申请空间)无初始化

分配一个大小字节的内存块,返回一个指向该块开头的指针。 新分配的内存块的内容没有初始化,保留不确定的值。 如果size为0,则返回值取决于特定的库实现(它可能是也可能不是空指针),但是返回的指针不能被解引用。 malloc:是用来申请内存空间的

free函数(动态内存释放)

free:可以释放申请的内存 主动释放动态开辟的内存空间 注意free不能将接收的指针赋值为NULL,需要主动赋值为NULL

代码:

代码语言:javascript
复制
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<stdlib.h>//malloc头文件
int main()
{
    int* p =(int*)malloc(40);//申请40个字节来存放10个整形
    //因为malloc返回为void*,需要强制类型转换为int*
    if(p==NULL)
    {
        printf("%s", strerror(errno));
        return 1;
    }
    //40个字节存放1-10
    for (int i = 0; i < 10;i++)
    {
        *(p + i) = i + 1;
        //p是起始位置地址,为整形,访问数组下标为i的元素,跳过int类型i的字节个数
        //i+1赋值
    }
    //打印
     for (int i = 0; i < 10;i++)
    {
        printf("%d ", *(p + i));
    }
    free(p);
    p = NULL;
}

开辟空间失败

代码语言:javascript
复制
 int* p =(int*)malloc(INT_FAST64_MAX);
    if(p==NULL)
    {
        printf("%s", strerror(errno));
        return 1;
    }

calloc函数(内存空间申请)初始化

malloc不存放元素打印出随机值,malloc申请到的空间没有初始化,直接返回的起始地址,效率高 而calloc申请好空间后,会把空间初始化为0,返回起始地址

代码语言:javascript
复制
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    int* p=(int*)calloc(10,sizeof(int));
    //参数为元素个数和类型占用几个字节
    if(p==NULL)
    {
        perror("calloc");
        return 1;
    }
    //使用
    for (int i = 0; i < 10;i++)
    {
        printf("%d ", *(p + i));
    }
    free(p);
    p = NULL;
    return 0;

realloc函数(调整空间)

如果第一个参数传入的一个NULL指针的话,功能相当于malloc功能

代码语言:javascript
复制
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    //内存空间开辟
    int* p = (int*)malloc(5 * sizeof(int));
    if(p==NULL)
    {
        perror("malloc");
        return 1;
    }
    //使用
    for (int i = 0; i < 5;i++)
    {
        *(p + i) = 1;
    }
    //调整
     int* ptr = (int*)realloc(p, 10 * sizeof(int));
     //可以调整原申请空间的大小
     //使用一个临时的指针来接收,保证p指针数据不丢失
     if(ptr!=NULL)//判断临时开辟的空间是否失败
     {
         p = ptr;
         ptr=NULL;
     }
     for (int i = 0; i < 10;i++)
    {
        printf("%d ", *(p + i));
    }
    free(p);
    p = NULL;
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-08-21,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • malloc函数(内存申请空间)无初始化
  • free函数(动态内存释放)
  • calloc函数(内存空间申请)初始化
  • realloc函数(调整空间)
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档