zoukankan      html  css  js  c++  java
  • c语言内存四区模型

    c语言内存四区模型: 代码区,全局区(常量区),栈区,堆区

    1、常量区

    char * getStr1()
    {
        //字符串常量"abcde"定义在常量区
        char *str= "abcde";
        //把这个字符串常量地址返回
        return str;
    }
    char * getStr2()
    {
        //这里的"abcde"和getStr1()方法中的常量值一样
        char *str= "abcde";
        return str;
    }
    
    char *p1 = getStr1();
    char *p2 = getStr2();
    //p2存储的地址和p1相同,
    
    printf("p1=%d, p2=%d
    ", p1, p2);
    //在常量区,两个变量的值完全一样,不会重新创建,直接把原来的返回
    //只会保留一份

    在全局区(常量区),两个字符串完全一样,编译器只会定义一份 

    2、临时区(栈区)

    char * getBuf()
    { 
      char buf[20]; 
      strcpy(buf, "abcde");
      return buf; 
    } //被调函数分配的内存,主调函数不能使用

    abcdX?  有乱码! 确实把内存地址返回了,但不能用。

    被调函数调用完毕,在临时区分配的内存统统消失 

    3、堆区

    char *buf= (char *)malloc(sizeof(char)*20); //手动malloc申请一份内存,由程序员手动管理

    利用malloc()函数,分配的内存空间不会马上释放,由程序员手动管理

    用完后free(buf); 否者出现内存泄漏

    总结:

      主调函数里分配的内存,不管在那个区,都可以在被调函数里使用

      如果被调函数在临时区(栈)分配内存,主调函数不能使用

      c可以在临时区分配内存,用完后自动被系统回收。多个函数都是用同一个堆区,栈区

      指针指向谁,就把谁的地址赋给指针

      指针变量和他所指向的内存空间变量,是两个不同概念

  • 相关阅读:
    杂题
    [ AtCoder Grand Contest 031] C
    [ AtCoder Regular Contest 107 ] C
    [ 实验舱 CSP/NOIP新赛制内部挑战赛4 ] 树上询问
    [ 2020牛客NOIP赛前集训营-提高组(第六场) ] 补题
    [NOI Online #2 提高组]子序列问题
    洛谷P4317 花神的数论题
    [AHOI2009]同类分布
    洛谷P3413 SAC#1
    数位dp小结
  • 原文地址:https://www.cnblogs.com/angmu/p/4096815.html
Copyright © 2011-2022 走看看