日期:2014-05-16  浏览次数:20621 次

linux和windows的内存组织方式

先看一道爱立信的笔试题,分析程序死循环的原因。


原因如下:

        这道题目涉及到内存区间开辟的问题了,程序在内存中的形式为:代码区,全局数据区,堆区和栈区。程序代码区存放函数体的二进制代码。全局区(静态区)(static),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统释放。堆区(heap)一般由程序员分配(new)释放(delete),若程序员不释放,程序结束时可能由OS回收。(注意它与数据结构中的堆是两回事,分配方式倒是类似于链表)。栈区就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。

参考资料:http://blog.sina.com.cn/s/blog_5b101dbf0100e1am.html



到这里基本已经回答除了上面那道程序题,但是,真的是这样吗?It's dependent! 我把这题改动了一下,发到一个技术讨论群里,让大家分析程序的输出结果(故意不告诉他们是死循环)很快就有人发现问题了,在linux下确实会死循环,但是在windows下却能正确输出,最后讨论的结论就是windows和linux内存组织形式不同,到底有什么不同呢?

下面的图片就是我查证的结果,参考《C和C++安全编码》http://book.douban.com/subject/4136222/


至此,这个问题就很明白了,这再次说明一个问题——实践出真知。还有一个类似的问题,经常有如下面试题,问为什么输出结果是1?


        正确答案请参考http://blog.csdn.net/lalor/article/details/7362929 (5.空结构体的大小),如果你能答出来输出结果在vs,vc,g++下是1,但是用gcc编译输出的是0,然后再回答出为什么在很多编译器下是1,那一定会让面试官刮目相看,而且这也充分说明了面试者细心,经常动手写代码。