个人中心
首页 > 面试有戏 > 面试题库 > 正文

C语言面试题 - 程序运行时内存布局是个什么样子?

来源:五百丁 作者:五百丁小编

很多笔试题都是关于变量在内存中怎样被创建、被操作以及被销毁,今天就来看看程序在运行时内存布局是个什么样子吧。


一、进程的地址空间


首先程序都以进程为实体在操作系统中运行,多个进程通过分时策略并发地运行,每个进程都有一块独立的内存空间,大家相互不打扰。看下进程的内存空间长啥样?


作为程序员,最关心的是“用户栈”和“运行时堆”两部分。这里的堆和栈,和数据结构中先进先出(FIFO)的堆和先进后出的栈是两码事。


堆栈(stack)往往简称栈,它是一块内存区。用以存放程序的局部变量,临时变量,函数的形参等,由系统自动分配和释放。


堆(heap)上的内存则是由用户调用malloc,new等系统函数进行分配,由用户负责释放。


二、内存不同区域的生命周期


程序在运行时,内存布局主要有堆、栈、全局静态区、常量区和代码区五个部分:

栈(stack area) , 编译器自动分配释放, 存放局部变量,形参等。

堆 (heap area), 由malloc,new等分配的空间(程序员自己管理)。

全局区(静态区)(static area),全局变量和静态变量的存储是放在一块的,在程序进入之前就已经存在,程序技术时系统释放,根据是否初始化分别放在分别是data区和bbs区

文字常量区 (const area) , 常量字符串就是放在这里的,程序结束后由系统释放

程序代码区(code area) , 存放程序的二进制代码

下面来看一段程序:


hello.cpp

int gNum; // static


int *func(int parameterA) //stack 

{

    float fNum; // stack 

    static int count; //static 

    char *pStr = "123456"; // const

    int *pList = new int[3]; //heap

    return pList; // stack 


}


这里涉及到的数据有:全局变量 gNum和静态变量count在静态区,局部变量 parameterA, fNum, pStr, pList在栈区,pList指向的内存在堆区域,“123456”在常量区域。

这些数据的存放区域都在代码中进行了标识,需要指出的是pList本身是在栈区域,因为它是个指针变量,只是保存了指向新申请内存的值而已。


三、不同区域变量的生命周期

全局区(静态区),该部分变量的内存在程序编译的时候就已经分配好,且在程序运行期间都存在,直到程序退出被销毁。包括全局变量和static变量。

在栈上创建的变量,在函数执行结束时这些自动被释放。

从堆上分配的内存,在malloc或new申请成功时被创建,在free或delete释放,生命周期由程序员手动管理。比较灵活,但容易导致内存泄露,现在很多动态语言都自动进行垃圾回收GC。

以前参加公司内部培训的时候,有老师提到外挂公司为了破解游戏,会通过分析内存数值变化去找到用户关键数据所在,然后通过程序修改达到快速升级的目的。但是要精确定位某个变量的内存区域,真不是件容易的事情,所以有时候外挂人员加班比我们还多~ 为他们默哀。。


四、函数调用过程


函数是一个完整的作用域,运行时会创建堆栈来保存数据,但执行完成返回后堆栈stack区域的变量全部被销毁。


void Func_1()

{

     Func_2()

}


void Func_2()

{

    Func_3()

}


void Func_3(int a, int b)

{

    print 'hello world'

}


调用过程是函数Func_1首先创建一个栈, 然后调用函数Func2再创建一个栈,函数Func2调用函数Func3再创建一个栈,如下图所示:


函数调用时可以分为以下几个步骤:建立堆栈,分配空间,执行,返回。


建立栈帧,获得函数执行的入口地址。然后将函数的形参入栈,这里需要注意的是,函数形参一般按照从右向左的顺序入栈。如上图中的Func_3是b先入栈,这里经常会出现笔试题。

然后为局部变量分配空间,开始执行。函数执行完后,先把返回值保存在寄存器中或者拷贝到接收地址。然后将堆栈全部销毁,所有栈区域的变量都不复存在。


程序运行时的内存布局基本就是这个样子,后续我们会把和这部分相关笔试题分析下,不得不说简直太多了~


0

二维码

1.五百丁遵循行业规范,任何转载的稿件都会明确标注作者和来源;

2.五百丁的原创文章,请转载时务必注明文章作者和"来源:五百丁",不尊重原创的行为五百丁或将追究责任;

3.作者投稿可能会经五百丁编辑修改或补充。

Word简历模板

  • 最美简历合集
  • WORD简历模板
  • 线轴简历模板 清爽风格
  • 图形化创意简历模板合集
客服在线时间:9:00-18:00

Copyright © 2014-2016 500d.me. All Rights Reserved.

个人中心 - 帮助中心 - 网站地图 - 粤ICP备14072413号