1
#include
"stdafx.h"
2#include
3#include
4#include56
int _tmain(int argc, _tchar* argv)
7
首先為什麼第11行沒有崩潰呢,其實這個跟第16行是一樣的,這個我們在操作這塊記憶體的時候,該塊記憶體不是系統暫用的記憶體區域,它就是一塊記憶體區域,我們可以任意寫資料,但是他確實會影響記憶體中的資料,當該函式退出是否堆疊的時候就會出現如下問題,我想這個問題大家還是經常遇到的:
有了上面的依據我們就可以簡單知道為什麼memcpy越界後會導致free的時候會出現崩潰了,那我們還需要了解memcpy的實現原理,其實memcpy是沒有對目的位址進行記憶體檢查的直接,將count大小的資料拷貝到dest中去,所以就存在跟上面陣列越界在函式退出的時候會出現崩潰一樣,如下:
1
void *memcpy(void *dest, const
void *src, size_t count)
2
typedef struct header header;如上其實我們在molloc(10)一塊記憶體的時候,真正申請的不止是10個位元組大小的記憶體,而是要加上乙個struct header結構體的大小,molloc返回給我們的記憶體想當於是p+sizeof(header)的指標,而在free的時候,則c語言只需要將p-sizeof(header)就能找到header結構,從而知道記憶體塊大小。
我們了解了如上的結構就大概知道為什麼會在free的時候出錯了,這是因為我們其實在memcpy的時候,已經破壞了相應的記憶體結構,這個會導致我們free的時候,操作記憶體的時候出現錯誤。
該觀點也是借助其他高人,自己總結的可能有所不正確,歡迎指正共同研究,參考文章:
由memcpy越界引起的崩潰
乙個linux的cm出了問題,在開發環境下,是正常的。在現場是崩潰的。比較環境的區別,輸入的資料不一樣。還好運氣不錯,拿到現場的資料,在開發環境中也能重現其中乙個資料引起的崩潰問題。崩潰現象,單步到函式fna,任務都做了,看任務結果也都有效,但是從函式返回時,還沒到呼叫處,就崩潰了。這bug現象,我...
memcpy 導致的段錯誤
在使用時注意不可用字串,如果是字串會導致段錯誤,可以使用asprintf函式複製字串。include include include int main 執行結果 segmentation fault除錯檢視就是在 memcpy token,s1 4 處出錯的 include include incl...
字段可以增大導致越界問題的解決
因為水晶報表字段長度是固定的 程式設計可以控制,此處不討論 在字段內容較多時,我們可以使用右鍵裡的 設定字段格式 公用 可以增大 來使其啟動折行顯示 為了顯示的效果,一般會在詳細資料節的底部畫一條橫線 這裡我為了顯示得比較明顯,加了顏色 於是,就出現了越界的問題,如下圖所示 黃色色塊欄位壓過了橫線 ...