• 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可以在临时区分配内存,用完后自动被系统回收。多个函数都是用同一个堆区,栈区

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

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

  • 相关阅读:
    洛谷 P5249 [LnOI2019]加特林轮盘赌 概率DP
    c++提高学习笔记——05-c++STLday10
    c++基础学习笔记——04-c++day09
    c++基础学习笔记——04-c++day08
    c++基础学习笔记——04-c++day07
    c++基础学习笔记——04-c++day06
    c++基础学习笔记——04-c++day05
    c++基础学习笔记——04-c++day04
    c++基础学习笔记——04-c++day03
    c++基础学习笔记——04-c++day02
  • 原文地址:https://www.cnblogs.com/angmu/p/4096815.html
Copyright © 2020-2023  润新知