user-0 提问: C语言 堆栈 静态存储区

回复:
user: user-1
content: http://en.wikipedia.org/wiki/Memory_management#DYNAMIC http://en.wikipedia.org/wiki/Automatic_variable

user: user-2
content: 1.你理解有误，堆才是向上的， 2.动态存储区就是堆，静态用来存储字符串常量，全局变量   3.上面说的都是操作系统里的，在数据结构中堆在是指栈，在一些编程题目会用到

user: user-3
content: 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

user: user-3
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时，会自动执行其析构函数，……  其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。  为什么要有数据结构这个东东？ 因为要将现实世界或者抽象理论中的各种数据保存在计算机外存（光盘、硬盘、U盘……）或内存（ROM、RAM、SRAM……）里面的二进制字节数组中。 然后让CPU这个只会执行预先保存好的加减乘除移位条件转移……等机器指令的家伙按照人的意志去处理这些数据。至于具体如何处理就是所谓算法。  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-4
content: 以32位操作系统为例，每一个应用程序都会对应4G的虚拟地址 （这里不讨论虚拟地址的概念，自己慢慢去学），  从 0x00000000  到  0xFFFFFFFF    从低地址到高地址， 其中存放数据的顺序如下， 0地址  -》 代码区 -》 全局区 -》 BSS 段 -》 堆  -》 栈 （栈后面还会有一小块内存存储当前系统的环境变量）-》 地址到3G 之后有操作系统的内核所持有， 应用程序无法使用3G - 4G这段虚拟地址。地址顺序由低到高。  代码区（只读常量区） ：  存放的内容是只读的， 包括已经初始化的具有常属性的 全局变量，和已经初始化的具有常属性的静态局部变量， 在代码区和全局区之间会存有字符串子面值。  全局区： 已经初始化的全局变量， 和静态局部变量.   BSS段：这个区域里只存储  未初始化的全局变量，   在程序一运行的时候， 该区域把这些全局变量全部清零， 之后就消失  堆： 存储程序中临时分配的内存  栈： 存储局部变量， 函数参数等  staitc const int  i = 10; //放在代码区 const char * str = "abcdefghjklm";  //在代码区和全局区之间， 此区域不可修改 int k = 100; // 代码区 void func( int temp, double db) //函数参数在栈区中 {      static const  int j = 100; //放在代码区      static int a = 100; //全局区      int * pa = (int*) malloc(sizeof(int) * 10); //在程序中临时分配的内存放在栈中      int h = 0; //存放在栈中     for(h = 0; h < 10 ; ++h)    {      ......    } }  其中前三个区域所占空间极小， 堆和栈可以有大量的空间，假设前面只占1M内存 从1M以后可能就是堆的起始点 ，假设堆占了500M。 从上往下增长  从3G开始， 以后是内核， 用户无法使用， 3G-1就是栈的起始点， 所以栈的大小只能从高地址到低地址，往上增长， 假设栈也只有500M。  堆和栈之间还用很多的空余， 这些空余的意义是假如程序运行中，堆的500M不够了， 就往下扩大， 栈也一样， 不够就往上增长。  顺便说一句， 搞嵌入式这些都不懂怎么搞

user: user-5
content: A  S  M

user: user-0
content: 那请问大神：如果我要学习这方面的知识，我需要看哪方面的知识？ 本人是做嵌入式的（入行半年），以前大学学的是电子信息专业，对操作系统不是很清楚（学过VB和C语言，VB都忘光了~）

user: user-6
content: 1.其实他们没什么特点,唯一的特点就是 栈的回收创建是系统来操作的,而堆的回收操作是由程序员来操作的  2.静态存储区会吧数据一直保留在程序结束！难道楼主说的动态是堆栈？那么就请看第一个,其实C语言没有动态存储区一说吧  3.当你在函数内部使用局部变量比如 int a = 10,char str[20]="1233333333"还有 调用函数的时候都会用到栈,在使用malloc申请的内存都是放在堆区的！比如 char * str = (char *)malloc(100*sizeof(char)); 堆区的数据需要程序员自己释放是否会容易造成内存泄漏

user: user-7
content: 操作系统是基础中的基础，感觉你对操作系统不了解，还有你对程序的链接、装载也不了解。这些东西不是一言两语就能说明白的，即使告诉你堆、栈、静态区是什么，你也不会有一个感性的认识。所以最好的方法是把这些基础学牢了，语言啥的都是高级工具，然后学这些的时候你才会明白为什么，不然你在编程这块走的不会太远。慢慢来，不要太急，基础好了，这些以后就慢慢知道了。

user: user-8
content: 堆是分配出来的，通过malloc这类函数， 栈是不需要分配，局部变量都属于这类。 其实不需要关心这么多的，你遇到的是什么问题

user: user-9
content: 1，堆，栈指内存，内存里的东西能永久保留么？ 2，静态存储区指 静态变量（static），常量（const），全局变量。动态指堆（malloc分配的）和栈 3，代码里的变量，大多数不是用堆就是用栈。只有比较少的用静态存储。   感觉lz还是多看几遍书吧，书上讲的比较清楚（当然不包括中国的教科书）

user: user-0
content: 感谢各位大神，拜读了~~~