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

一分钟掌握malloc函数的本质-C语言,第1张

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<<cnt_a[i]<<" ";
        } cout<<endl;
        for(int i=0;i<10;i++){
            cout<<cnt_b[i]<<" ";
        } cout<<endl;
    
        return 0;
    }
    
  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<<cnt_a[i]<<" ";
        } cout<<endl;
        for(int i=0;i<10;i++){
            cout<<cnt_b[i]<<" ";
        } cout<<endl;
    
        return 0;
    }
    
2.2.2 实验结果
  1. 普通数组版本

  2. malloc版本

2.2.3 结论

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

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1353631.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-14
下一篇2022-06-14

发表评论

登录后才能评论

评论列表(0条)

    保存