GetMem與AllocMem造成的差異 |
答題得分者是:sryang
|
cookiecs
一般會員 發表:1 回覆:2 積分:0 註冊:2010-11-05 發送簡訊給我 |
各位前輩好:
小弟遇到一個問題百思不得其解,想請教各位前輩。 假設ClientSocket用ClientSocket.Socket.SenText 傳送 第一個String ('1234567890'); 第二個顯示的是 tpoint:=Allocmem(ti); 就都是正常顯示。 可以請問是什麼原因造成的嗎? 希望能有人解惑。謝謝 註:使用版本,Delphi 2010
------
一切只是懵懵懂懂 |
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
StrPas 要遇到 #0 才會停止
而 AllocMem 是呼叫 GetMem 之後,再呼叫 FillChar 填入 #0,所以會正常 如果你要用 GetMem 的話,記得後面加一行 FillChar(pointer^, size, #0) 否則你一 StrPas 下去,就使用到不屬於你的記憶體了 如果是寫入的話,這種 BUG 就叫做「緩衝區溢位」,是很危險的動作!! 輕則資料異常,程式當掉,重則被利用來殖入惡意程式碼進而控制你的系統。
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/ |
cookiecs
一般會員 發表:1 回覆:2 積分:0 註冊:2010-11-05 發送簡訊給我 |
謝謝Sryang的回答,這是很寶貴的學習經驗。
===================引 用 sryang 文 章=================== StrPas 要遇到 #0 才會停止 而 AllocMem 是呼叫 GetMem 之後,再呼叫 FillChar 填入 #0,所以會正常 如果你要用 GetMem 的話,記得後面加一行 FillChar(pointer^, size, #0) 否則你一 StrPas 下去,就使用到不屬於你的記憶體了 如果是寫入的話,這種 BUG 就叫做「緩衝區溢位」,是很危險的動作!! 輕則資料異常,程式當掉,重則被利用來殖入惡意程式碼進而控制你的系統。
------
一切只是懵懵懂懂 |
cookiecs
一般會員 發表:1 回覆:2 積分:0 註冊:2010-11-05 發送簡訊給我 |
|
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |