文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【C语言进阶】那些你必须掌握的C/C++要点——动态内存管理(1)

2023-08-20 18:45

关注

在这里插入图片描述

君兮_的个人主页

勤时当勉励 岁月不待人

C/C++ 游戏开发


Hello,米娜桑们,这里是君兮_,之前写了一篇有关数据结构顺序表的文章,中间引用了大量的动态内存开辟的知识,今天就来带大家详细了解一下动态内存管理这部分非常重要的知识,保证大家看了后都会对这部分有一个更加深刻的理解!
好了,废话不多说,开始今天的学习吧!

int val = 20;//在栈空间上开辟四个字节char arr[10] = {0};//在栈空间上开辟10个字节的连续空间

1.malloc

void* malloc (size_t size);

2.free

void free (void* ptr);
#include #include  int main(){    //int arr[10];    int* p = (int*)malloc(40);//开辟40个字节的整形空间,把返回的开辟好空间的起始地址保存在p中        if (p == NULL)//判断malloc开辟内存是否成功    {    perror("malloc");//如果没成功,通过perror来报错    return 1;    }    //开辟成功    int i = 0;    for (i = 0; i < 10; i++)    {    printf("%d\n", *(p + i));//打印一下此时p中空间存储的内容    }        free(p);//用完后释放空间,把开辟的空间返回给操作系统    p = NULL;//将p置空    return 0; }

在这里插入图片描述

除了注释中提到的点,还有以下几个值得注意的问题:

C语言还提供了一个函数叫 calloc , calloc 函数也用来动态内存分配。原型如下:

void* calloc (size_t num, size_t size);
#include #include int main(){int *p = (int*)calloc(10, sizeof(int));if(NULL != p){//使用空间}free(p);p = NULL;return 0;}

在这里插入图片描述

void* realloc (void* ptr, size_t size);

1.原地扩容

在这里插入图片描述
扩展内存直接在原有内存之后直接追加空间,原来空间的数据不发生变化。

2.异地扩容

在这里插入图片描述

#include int main(){    int* ptr = (int*)malloc(100);    if (ptr != NULL)    {        //业务处理    }    else    {        exit(EXIT_FAILURE);    }    //扩展容量    //代码1    ptr = (int*)realloc(ptr, 1000);//这样可以吗?(如果申请失败会如何?)    //代码2    int* p = NULL;    p = realloc(ptr, 1000);    if (p != NULL)    {        ptr = p;    }    //业务处理    free(ptr);    return 0;}

1.对NULL指针的解引用操作

void test(){int *p = (int *)malloc(INT_MAX/4);*p = 20;//如果p的值是NULL,就会有问题free(p);}

2.对动态开辟空间的越界访问

void test(){    int i = 0;    int* p = (int*)malloc(10 * sizeof(int));    if (NULL == p)    {        exit(EXIT_FAILURE);    }    for (i = 0; i <= 10; i++)    {        *(p + i) = i;//当i是10的时候越界访问    }    free(p);}

3 对非动态开辟内存使用free释放

void test(){int a = 10;int *p = &a;free(p);//ok?}

4 使用free释放一块动态开辟内存的一部分

void test(){int *p = (int *)malloc(100);p++;free(p);//p不再指向动态内存的起始位置}
#include #include int main() {    // 分配动态内存    char* ptr = malloc(10);    // 检查内存是否成功分配    if (ptr == NULL) {        // 处理内存分配失败的情况        return 1;    }    // 复制数据到新的内存块    char* newPtr = malloc(5);    memcpy(newPtr, ptr, 5);    // 释放原始的内存块    free(ptr);    // 使用新的内存块进行操作    // 释放新的内存块    free(newPtr);    return 0;}

5.对同一块动态内存多次释放

void test(){int *p = (int *)malloc(100);free(p);free(p);//重复释放}

6.动态开辟内存忘记释放(内存泄漏)

void test(){int *p = (int *)malloc(100);if(NULL != p){*p = 20;}}int main(){test();while(1);}

新人博主创作不易,如果感觉文章内容对你有所帮助的话不妨三连一下这个新人博主再走呗。你们的支持就是我更新的动力!!!

**(可莉请求你们三连支持一下博主!!!点击下方评论点赞收藏帮帮可莉吧)**

在这里插入图片描述

来源地址:https://blog.csdn.net/syf666250/article/details/132047098

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯