栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

一分钟掌握malloc函数的本质-C语言

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

一分钟掌握malloc函数的本质-C语言

1. 语法使用

需要导入头文件#include

// 1. 申请一个链表中的节点
ListNode* tmpNode = (ListNode*)malloc(sizeof(Node));
// 2. 申请一个数组
int* array_int = (int*)malloc(sizeof(int)*10);
char* arrar_char = (char*)malloc(sizeof(char)*10);
2. 使用malloc申请的数组和普通数组的区别
  1. 使用malloc申请的数组,内存分配在堆中,程序员不free,就存在,直到程序结束,由系统回收。如果不和free配对使用,有可能造成内存泄露。
  2. 普通数组-局部变量,内存分配在栈中,局部函数结束,就被回收。
2.1 存储区域介绍
区域作用生命周期
栈区存放局部变量名栈区(stack)–由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
堆区存放new或者malloc出来的对象堆区(heap)–般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式类似于链表。
静态区用于存放全局变量或者静态变量全局区(静态区)(static)–全局变量和静态变量的存储是放在一块的。程序结束后由系统释放。
2.2 实验 2.2.1 功能和代码

下面俩个程序均是对传入的整数的每一位数字进行统计和函数,唯一的不同在于int版本test函数中使用普通数组返回,而malloc版本中返回的是malloc出来的数组。
思考一下有什么不同,然后我们来看实验结果。

  1. 普通数组版本:
    #include
    using namespace std;
    int* test(int x){
        int cnt[10];
        for(int i=0;i<10;i++) cnt[i] = 0;
    
        do{
            int k = x%10;
            cnt[k]++;
            x = x/10;
        }while(x!=0);
        return cnt;
    }
    
    int main()
    {
        int a = 123;
        int b = 456;
        int* cnt_a = test(a);
        int* cnt_b = test(b);
        for(int i=0;i<10;i++){
            cout<
            cout< 
  2. malloc版本:
    #include
    using namespace std;
    int* test(int x){
        int *cnt = (int*)malloc(sizeof(int)*10);
        for(int i=0;i<10;i++) cnt[i] = 0;
    
        do{
            int k = x%10;
            cnt[k]++;
            x = x/10;
        }while(x!=0);
        return cnt;
    }
    
    int main()
    {
        int a = 123;
        int b = 456;
        int* cnt_a = test(a);
        int* cnt_b = test(b);
        for(int i=0;i<10;i++){
            cout<
            cout< 
2.2.2 实验结果
  1. 普通数组版本

  2. malloc版本

2.2.3 结论

普通申请的数组,在函数结束之后就被系统回收,不能用于返回。
但是malloc申请的数组,只要没有调用free函数进行回收,一直会存在,可以用于返回。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/960300.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号