線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1516
推到 Plurk!
推到 Facebook!

記憶體釋放問題

尚未結案
syao
初階會員


發表:66
回覆:63
積分:25
註冊:2005-02-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-27 04:22:39 IP:59.104.xxx.xxx 未訂閱
#include 
#include 
int main(int argc, char *argv[])
{
    
  char *str = (char *)malloc(sizeof(char)*50);
  
  if ( !str ) printf("error");  
  str = "hello world";
  
  printf("%p\n",&str);     
  printf("%s\n",str);  
      
  free (str);
  
  printf("%p\n",&str); 
  printf("%s",str);
  
  system("PAUSE");
  return 0;    }
為什麼free(str); 後 printf("%p\n",&str); printf("%s",str); str位址 & 字串都還存在?? 懂得朋友可以解惑一下嗎?? 謝謝
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-27 18:13:18 IP:59.115.xxx.xxx 未訂閱
syao 您好:    您將配置的空間 free 掉之後,並不代表著該位置的資料會被 "清空" 或者是 "消失掉",這個動作僅僅是是告訴系統:"原先配置的空間可以再被使用了",就好比說;您開了一輛車子到停車場,並將車子停在某個車位上,於是您的車子佔用了這個空間 (malloc),別人可以將車子停到其它的車位,但是不能停在您現在停車的位置,但是當您將車子開走之後 (free),其他人就可以將車子停到您原先停車的位置了,儘管如此;原先那個車位的空間並不會因此而消失掉,地上的油污也不會因為您將車子開走就自動的被清除掉,除非有人去清洗過。 7 天天敲鍵盤 v 時時按滑鼠 8
syao
初階會員


發表:66
回覆:63
積分:25
註冊:2005-02-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-10-27 21:45:55 IP:59.104.xxx.xxx 未訂閱
RedSnow謝謝解答    地上的油污也不會因為您將車子開走就自動的被清除掉,除非有人去清洗過。    清洗過是指該記憶體空間再被其它資料給使用覆蓋的意思嘛?? 謝謝
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-27 22:20:58 IP:59.115.xxx.xxx 未訂閱
syao 您好:
引言:清洗過是指該記憶體空間再被其它資料給使用覆蓋的意思嘛??
是的,可以是其它資料配置空間時使用到該區域,然後將內容覆蓋掉,也可以是由設計者下指令去改變內容,例如使用 memset() 函式將內容清為 NULL。 7 天天敲鍵盤 v 時時按滑鼠 8
syao
初階會員


發表:66
回覆:63
積分:25
註冊:2005-02-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-10-28 01:35:15 IP:59.104.xxx.xxx 未訂閱
#include 
#include 
#include 
#include     int main(int argc, char *argv[])
{
    
  char *str = (char *)malloc(sizeof(char)*50);  
  if ( !str ) printf("error"); 
  str = "hello world";
  printf("%s\n",str);
  free (str);
  
  memset(str,'C',49);
  
  printf("%s",str);
  
  system("PAUSE");
  return 0;    }    
請問為什麼我想把釋放的空間清成字元C memset(str,'C',49); 為什麼我編譯後執行後會發生錯誤
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-10-28 09:09:09 IP:59.104.xxx.xxx 未訂閱
你跟系統要一塊空間來用。malloc 你還系統這塊空間。free 當這塊空間不屬於你的使用權時。不在 malloc 跟 free 之間的 code 時 你只能”讀”不能”寫”你寫就會出事。 不然,大家都去改寫作業系統所佔到的位置。然後讓它當機就好了。 ^_^
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-10-28 09:38:06 IP:59.115.xxx.xxx 未訂閱
syao 您好:    原本在變數被 free 掉之後,就不應該再對該變數原先的使用空間做存取,我前一篇提到 memset 只是針對您的提問做個說明而已,但是這終究不是正規的作法,希望您僅僅是純討論,而不是打算拿來實作,為了避免您及其他看倌產生誤解,我再強調:以下說法純屬討論。    就算您將空間釋回之後,要以 memset() 來做測試好了,或許應該要以原先已經實際填寫過內容的空間為對象,如果您的測試方式改為下列這個樣子大概就不會產生錯誤了: memset(str, 'C', strlen(str)); 7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/10/28 09:47:58
系統時間:2024-05-10 23:25:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!