在进行C/C++以及嵌入式开发的时候要对内存的了解比较精确,经常要操作的内存分类可以如下:栈区(stack)、堆区(heap)、常量区、静态区(全局区)(static)、代码区。
栈区由编译器自动分配和释放,一般存放函数的参数、局部变量的值等,操作和数据结构中的栈的操作类似。
堆区由程序员自己分配与释放,如果程序员不释放,则在程序运行完后,可能由系统收回,它与数据结构中的堆是不同的概念,分配方式与链表类似,可以用malloc、new来申请,
全局区(静态区)存放全局变量、全局静态变量、局部静态变量,全局变量与静态变量存放是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域。程序结束后由系统释放。
常量区存放字符串等,在程序结束后由系统释放。
代码区存放函数体的二进制代码。
int qa = 10;//全局初始化区,存放在全局区(静态区)
char *pv;//全局未初始化区,存放在全局区(静态区)
main()
{
int a;//局部变量,存放在栈
char *pa;//栈
char *p = "asdasdasd";//p存放在栈区,字符串存放在常量区
static int b=1;//全局(静态)初始化区
pa = (char *)malloc(10);//分配得来的10字节就存在堆区,
strcpy(pa,"3156564654");//后面的字符串数字存放在常量区,
}
对于一个进程的内存空间而言,可以在逻辑上分为三个区:代码区、动态数据区、静态数据区。
动态数据区就是“堆栈”,栈是线性结构,堆是链式结构。进程的每个线程都独自的私有“栈”,所以每个线程虽然代码一样,但本地变量的数据都是互不干扰的。
/***********************************************************************************************************/
BSS(Block Started by Symbol)通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。特点是:可读写的,在程序执行之前BSS段会自动清0。所以,未初始的全局变量在程序执行之前已经成0了。BSS段属于静态内存分配。
注意和数据段的区别,BSS存放的是未初始化的全局变量和静态变量,数据段存放的是初始化后的全局变量和静态变量。数据段属于静态内存分配。