最近在准备面试,面试职位为C++软件开发类型,虽然还没有与某公司签约,但是经过多次的面试经验及过程进行分享!
程序的内存分配问题是每个IT公司都会问道的一个问题!现就内存分配问题分享我的总结。
内存总共有以下5类存储区:堆区、栈区、全局(静态)存储区、文字常量区以及程序代码区。
堆区:由程序员手动分配内存和释放内存,分配方式类似链表;若程序员不释放内存,则在程序结束时由系统释放。
在c语言中使用malloc函数在堆上分配内存,如:char* p1=(char *)malloc(1);//由free释放
在c++语言中使用new运算符在堆上分配内存,如:char *p2=new char[1];//由delete[ ]释放
一般速度比较慢,而且容易产生内存碎片,不过使用起来方便。
栈区:由编译器自动分配和释放内存,一般存放函数的参数值以及局部变量的值等,操作方式类似数据结构中的栈,速度较快。
全局(静态)存储区:存放全局变量以及静态变量,程序结束时由系统释放,分为DATA段(全局初始化区)与BSS(全局未初始化区)。
DATA段(全局初始化区):初始化的全局变量和静态变量存放在DATA段
BSS(全局未初始化区):未初始化的全局变量和静态变量存放在BSS段,在执行之前BSS段会自动清0,即未初始化的全局变量和静态变量在程序执行之前已经成为0。
文字常量区:存放常量字符串,程序结束后由系统释放。
程序代码区:存放函数体的二进制代码。
参考代码如下:
#include<stdio.h>
int k=1;
void main()
{
int i=1;
char *j;
static int m=1;
char *n="hello";//指针变量为存放于栈区内,其内容为一个地址,改地址为"hello"在文字常量区所在的地址
printf("栈区地址为:0X%x\n",&i);
j=(char *)malloc(2);
free(j);
printf("堆区地址为:0X%x\n",j);
printf("全局变量区地址为:0X%x\n",&k);
printf("静态存储区地址为:0X%x\n",&m);
printf("文字常量区地址为:0X%x\n",n);
printf("程序代码区地址为:0X%x\n",&main);
}