Linux和Windows的内存组织方式

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

int index;   int avg[3];   for(index = 0; index < 5; index++)   {       avg[0] = 10;       avg[1] = 12;       avg[2] = 10;       if(index / 2)           avg[3] = 0;       else           avg[3] = 1;   }  

原因如下:

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

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

下面的图片就是我查证的结果

Linux和Windows的内存组织方式

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

#include <stdio.h>       struct node   {   }   ;   int main(int argc, char* argv[])   {       printf("%d\n"sizeof(struct node));       return 0;   }  

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/pswzz.html