2011-03-09 47 views
0

我在C程序的問題:調試 什麼是錯的過程中Ç調試問題,免費方法

char *str = (char *) malloc(20); 
strcpy_s(str, 10, "abcdefghij"); 

//here I change one byte before str and one byte after 
*((int*)str-1) = 10; 
*((int*)(str+20)) = 10; 

//and it stops on the.. 

free(str); 

線?

覆蓋未分配內存的部分是該任務的一部分。我知道這通常是不正確的,但在這種情況下,這是任務的一部分。

+0

正交你的問題,但[不投'malloc'在C]( http://c-faq.com/malloc/mallocnocast.html)。它可以隱藏錯誤。 – 2011-03-09 15:13:58

+0

如果您在使用malloc()分配的緩衝區外寫入​​,那麼您希望發生什麼? – DavidK 2011-03-09 15:15:45

回答

4

由於您只請求了20個字節,所以您不允許寫入str+20,因此str+19是您擁有的最後一個字節。 str-1也是如此。

+0

我知道,但這正是我需要的 - 覆蓋分配字節序列後的字節。它不應該影響免費的方法,我想 – Sergey 2011-03-09 15:17:33

+0

@Sergey,所以請'malloc'來請求這個內存!你不允許訪問你沒有請求的內存。 – 2011-03-09 15:18:43

+2

@Sergey:嘗試覆蓋該序列後,技術上會導致未定義的行爲。它可能會崩潰,或者做任何想要的事情。只是不要這樣做 – 2011-03-09 15:19:20

5

爲什麼地球上你會認爲你有權改變位於str-1的任何東西?你沒有:)

看來你還有另一個問題,其中,由於第一個的生動性過去了我的注意。您可能會訪問的地址從str + 0str + 19str + 20超出你的領域:)

這兩件事情都會導致所謂的undefined behavior。這意味着你不能驚訝於任何的行爲!包括失敗的free,調試器崩潰或其他任何其他

4

在你分配的內存之外寫入內存給出了未定義的行爲。

在這種特殊情況下,我們可以猜測堆管理器可能是有一些關於存儲在它交給你的內存之前存儲的每塊內存的簿記信息。當您在分配的塊之前寫入字節時,會覆蓋其中的一部分,因此無法再正確釋放該塊。

2

*((int*)str-1)通常用於存儲分配的空間的長度,使free知道多少字節釋放...

+0

+1很好的回覆!這直接回答了爲什麼'免費'失敗的問題。 – 2011-03-09 15:20:15

+0

我檢查了這個字節,這不是大小 – Sergey 2011-03-09 15:25:23

+0

我使用visual studio 2010,也許不同的編譯器做不同? – Sergey 2011-03-09 15:25:53