2011-12-09 59 views
4

不時,我將有一個差一錯誤類似如下:什麼機制檢測未分配內存的訪問?

unsigned int* x = calloc(2000, sizeof(unsigned int)); 

printf("%d", x[2000]); 

我已經超出了分配的區域結束,因此我在運行時得到一個EXC_BAD_ACCESS信號。我的問題是:這是如何檢測到的?看起來這只是默默地返回垃圾,因爲我只關閉了一個字節而不是整個頁面。系統的哪一部分阻止我僅僅在x + 2000返回垃圾字節?

+3

這可能是一些很好的閱讀:http://loufranco.com/blog/files/Understanding-EXC_BAD_ACCESS.html –

回答

1

內存系統在其內存字段的開始和結尾處具有標記值,超出了您分配的字節。釋放內存時,會檢查這些值是否完整。如果沒有,它會告訴你。

0

也許你只是幸運,因爲你正在使用2000作爲一個大小。根據int的大小,總大小可以被3264整除,因此它的結束機率真的會終止「真實」分配。嘗試使用一些奇數字節(爲此,最好使用char數組),並查看您的系統是否仍然檢測到它。

在任何情況下,您都不應該依靠這種方式找到這些錯誤。總是使用valgrind或類似的方式來檢查你的內存訪問。