linux和windows的記憶體組織方式

來源:互聯網
上載者:User

先看一道愛立信的筆試題,剖析器死迴圈的原因。

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回收。(注意它與資料結構中的堆是兩回事,分配方式倒是類似於鏈表)。棧區就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是局部變數、函數參數等。

參考資料:http://blog.sina.com.cn/s/blog_5b101dbf0100e1am.html



到這裡基本已經回答除了上面那道程式題,但是,真的是這樣嗎?It's dependent! 我把這題改動了一下,發到一個技術討論群裡,讓大家剖析器的輸出結果(故意不告訴他們是死迴圈)很快就有人發現問題了,在linux下確實會死迴圈,但是在windows下卻能正確輸出,最後討論的結論就是windows和linux記憶體組織形式不同,到底有什麼不同呢?

下面的圖片就是我查證的結果,參考《C和C++安全編碼》http://book.douban.com/subject/4136222/

   


為了驗證,測試下面程式的輸出結果:

#include <iostream>using namespace std;int main(int argc, char* argv[]){int index;int avg[3];cout << &index << "\t" << &avg[0] << "\t" << &avg[1] << "\t" << &avg[2] << "\t" << &avg[3] << endl;return 0;}

在Ubuntu+g++下,輸出結果是:

0xbf8e0b6c        0xbf8e0b60 
0xbf8e0b64        0xbf8e0b68 
0xbf8e0b6c

在Windows7+VS2010下的輸出結果是:

0026FA30        0026FA1C        0026FA20        0026FA24        0026FA28


至此,這個問題就很明白了,這再次說明一個問題——實踐出真知。還有一個類似的問題,經常有如下面試題,問為什麼輸出結果是1?

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

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.