C/C++ 中程序内存区域划分

今天来讨论讨论C/C++中程序内存区域划分吧!
话不多说,先看一看下面是 在下 整理的绘图,更有助于理解程序内存的划分
在这里插入图片描述
先简单说一说这几个区域,当然还有更重要的关键点还在后面,不要退出哦!!
1.栈区(stack):在执行函数时,函数内局部变量的内存单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。
2.堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。分配方式类似于链表。
3.数据段(静态区)(static):存放全局变量、静态数据。程序结束后由系统释放。
4.代码段:存放函数体(类成员函数和全局函数)的二进制代码。
这张图片有这么几个关键点
1.先说一说图片中的字符数组和字符指针的初始化,字符数组ch[] 是在栈空间开辟了5个字符大小的空间,里面的内容为’a’ ‘b’ ‘c’ ‘d’ ‘\0’; 而*pch是先在栈空间开辟了一个指向字符的指针变量,然后把代码段中的"abcd" 的首字符 a 的地址放到指针变量pch中,所以,pch指向的内容是不能改变的,pch处于只读状态。
2.再有就是栈区和堆区的理解,调用malloc等函数是由我们分配的内存是在堆区开辟的,是我们管理的,我们也要记得把开辟的空间给释放了。
3.普通的局部变量是在栈区分配空间的,栈区的特点是在上面创建的变量出了作用域就销毁。但是被static修饰的变量存放在数据段,数据段的特点是在上面创建的变量,直到程序结束才销毁,所以生命周期长。
4.理解栈区也更好地帮助我理解了递归函数,调用某递归函数就要不停地入栈直到退出条件为止,再不停地出栈,最终得到函数的返回结果。

你可能感兴趣的:(C/C++ 中程序内存区域划分)