Linux和Windows的内存组织方式


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

  1. int index;  
  2. int avg[3];  
  3. for(index = 0; index < 5; index++)  
  4. {  
  5.     avg[0] = 10;  
  6.     avg[1] = 12;  
  7.     avg[2] = 10;  
  8.     if(index / 2)  
  9.         avg[3] = 0;  
  10.     else  
  11.         avg[3] = 1;  
  12. }  

原因如下:

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

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

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

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

  1. #include <stdio.h>   
  2.   
  3. struct node  
  4. {  
  5. }  
  6. ;  
  7. int main(int argc, char* argv[])  
  8. {  
  9.     printf("%d\n"sizeof(struct node));  
  10.     return 0;  
  11. }  

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

相关内容