歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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. }  

正確答案請參考 http://www.linuxidc.com/Linux/2012-06/64063.htm(5.空結構體的大小),如果你能答出來輸出結果在vs,vc,g++下是1,但是用gcc編譯輸出的是0,然後再回答出為什麼在很多編譯器下是1,那一定會讓面試官刮目相看,而且這也充分說明了面試者細心,經常動手寫代碼。

Copyright © Linux教程網 All Rights Reserved