局部变量、全局变量、堆、堆栈、静态和全局

“程序空间“指二进制可执行指令序列(包括一些常量)存放的空间,”变量空间“指程序运行时各种变量(局部的和全局的)以及堆栈的存放空间。程序空间可以定位在CPU内部Flash、CPU内部RAM、外部SRAM和外部NOR Flash。变量空间只能定位在CPU内部SRAM和外部SRAM。

 

一个由C/C++编译的程序占用的内存分为以下几个部分

(1)栈区(stack)—  由编译器自动分配释放,存放函数的参数值,局部变量的值等。

(2)堆区(heap) —  由程序员分配和释放,若程序员不释放,程序结束时可能由OS回收。

(3)全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,  未初始化的全局变量、未初始化的静态变量在相邻的另一块区域。

(4)文字常量区  —  常量字符串就是放在这里的。

(5)程序代码区  —  存放函数体的二进制代码。

 

堆栈(stack)是内存中的一个连续的块。一个叫堆栈指针的寄存器(SP)指向堆栈的栈顶。堆栈的底部是一个固定地址。堆栈有一个特点就是,后进先出。也就是说,后放入的数据第一个取出。

 

堆(heap)是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。

 

○在高级语言中,程序函数调用、函数中定义的变量都用到栈(stack)。

○用malloc, calloc, realloc等函数分配得到变空间是在堆(heap)上。

○在所有函数体外定义的是全局量。

○加了static修饰符后不管放在在哪里都属于静态变量,存放在全局区(静态区)

○在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用。

○在函数体内定义的static表示只在该函数体内有效。

○函数中的"abcdef"这样的字符串存放在常量区。

猜你喜欢

转载自blog.csdn.net/tianyukobe/article/details/81135065