2012-02-09 109 views
1

幫助我理解malloc的行爲..我的代碼如下::malloc分配內存和SIGSEGV

int main() 
    { 
    int *ptr=NULL; 
    ptr=(int *)malloc(1); 
    //check for malloc 
    *ptr=1000; 

    printf("address of ptr is %p and value of ptr is %d\n",ptr,*ptr); 
    return 0; 
    } 

上述程序工作正常(無差錯運行)...怎麼樣?因爲我只提供了1個字節的值1000!

我是否覆蓋堆中的下一個內存地址? 如果是,那麼爲什麼不sigsgev在那裏?

+1

的行爲是不確定的,整個事情,所以它可能會或可能不會崩潰。在某些實現中,當你釋放(ptr)時,程序會崩潰。 – 2012-02-09 13:02:09

+0

它需要用包裝做點什麼嗎?通常使用32位應用程序進行4字節的默認打包。 – 2012-02-09 13:02:22

回答

1

使用調試堆,當您釋放內存時(但您沒有撥打免費電話),您肯定會收到崩潰或其他通知。

分段錯誤是針對頁面級訪問衝突的,而內存頁面通常是4k的數量級,所以3個字節的溢出不太可能被檢測到,直到更細粒度的檢查檢測到它或其他部分的代碼崩潰,因爲您用'垃圾'覆蓋了一些內存

2

malloc的很多實現將以某種「分辨率」分配以提高效率。

這意味着,即使你爲一個字節,你很可能已經得到了16或32

然而,這是不是你可以依賴,因爲它是不確定的行爲。

未定義行爲意味着什麼可以發生,包括儘管有問題的代碼工作:-)

+0

先生,(可能是這個愚蠢的問題..但我需要問).. 什麼是「許多malloc的實現」? 所有那些使用gcc n glibc的人(從標準網站下載..)實現/定義必須相同...... na ?? n 是否有像malloc,free等函數的標準定義? – saurabh 2012-02-09 13:23:40

+0

@saurabh:是的,gcc(或mor正確glibc)可能有一個特定的實現,但這不是唯一的一個。 MSVC有它自己的,IBM的xlc有另一個等等。 GLibC只是一個實施。 ISO C標準指定了定義,但它通常涵蓋_behaviour_而不是_implementation._ – paxdiablo 2012-02-09 13:38:58

+0

大多數'malloc'實現都是通過更大的塊從操作系統(通常是內核,通過系統調用)請求堆內存(通常是幾頁4K字節)。在Linux上,'malloc'有時可能會使用'mmap'(可能是'sbrk')系統調用來從內核請求「大塊」內存。然後'malloc'的實現將會把這個塊切成小塊,等等......像往常一樣,邪惡在細節中。 – 2012-02-09 13:54:23