C语言内存四区模型详解(未完成)

本文最后更新于:2019年11月14日 晚上

本文是关于C语言的内存四区分布,并未从书上找到相关内容,所以本文的内容依据主要来自 传智播客-黑马程序猿 的教学视频,以及参考自众多博客,会在文末统一附出链接地址。

内存四区模型

概述

C语言程序在被执行过程中,操作系统将程序所占用的内存分为四个区域:栈、堆、全局区以及代码区。每一个程序占用的内存都会有这四个区域。而设计内存四区的目的,就像公司分不同的职位与部分,便于更好的管理,提高工作执行的效率,同时不同区域的变量以及常量的生命周期不同,我们可以根据我们的需要,灵活运用去编程。

C语言内存四区

上图来自 **传智播客-黑马程序猿** 的教学视频。

C语言内存四区

上图来自 **[堆、栈、全局区静态区、文字常量区、程序代码区](https://blog.csdn.net/peeno/article/details/52808686 "堆、栈、全局区静态区、文字常量区、程序代码区")** 的博客中
### 功能介绍
  1. 栈区(stack): 存放函数参数、局部变量等,由编译器自动分配释放。
  2. 堆区(heap):存放动态分配的数据(malloc/new),由程序猿手动分配释放,程序结束时也会有操作系统自动回收。
  3. 全局区(global):包含常量、全局变量、静态变量等,文字常量区也包含在内。程序结束后由操作系统释放。
  4. 代码区(code):存放函数体的二进制代码。

栈区

堆区

全局区

全局区包含常量,静态变量等等。以文字常量区为例。文字常量是只读的,不可以修改。当要使用一段字符串时,会现在文字常量区进行查找,如果有就使用,没有的话就创建。

例子:通过打印地址来验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//测试环境VS2013
#include <stdio.h>
#include <stdlib.h>
char * get_str1()
{
char * p = "I Love CPP";
return p;
}

char * get_str2()
{
char * q = "I Love CPP";
return q;
}

int main()
{
char * p = nullptr;
char * q = nullptr;
p = get_str1();
q = get_str2();
printf("p : %s,p的地址为:%d \n", p, p);
printf("q : %s,q的地址为:%d \n", q, q);
system("pause");
return 0;
}

输出结果

C语言文字常量区

地址相同,说明一旦文字常量区存在字符串,就不需要再被创建。

以字符串字符数组为例综合说明内存四区分布

参考链接

CSDN博客: C语言程序内存四区(栈区,堆区,全局区,代码区)

CSDN博客: 栈区,堆区,全局区,文字常量区,程序代码区 详解(实际上主要内容是栈和堆的知识)

https://blog.csdn.net/qq_37764129/article/details/80784845

https://www.cnblogs.com/letben/p/5236674.html

https://www.cnblogs.com/shijiaqi1066/p/6146865.html

https://www.jianshu.com/p/98cb5f584a31

https://blog.csdn.net/helloyurenjie/article/details/79795059

https://blog.csdn.net/dajiabudongdao/article/details/51945041

https://blog.csdn.net/ic_tv/article/details/46718907

https://blog.csdn.net/wu5215080/article/details/38899259

https://www.cnblogs.com/crazyzhang/p/5727822.html