面试题中常见的内存分配问题汇总

时间:2023-01-09 16:05:21

最近在准备面试,面试职位为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);

}