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

char *與AnsiString一問

答題得分者是:brook
gump996
一般會員


發表:10
回覆:8
積分:3
註冊:2002-10-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-21 13:30:50 IP:61.225.xxx.xxx 未訂閱
在Builder5中,有一個我呼叫的DLL(在VC 6.0上寫的)函式宣告如下: BOOL ConnectServer(char szHost[], int iPortNum); 在程式中宣告: char szHost[] = "127.0.0.1"; int iPort = 2002; 然後呼叫ConnetServer(szHost, iPort); 連結可以成功; 但是我換另一種方式,假設有一個Edit元件,是用來輸入Host Name的, 加上宣告入下: char *szHost; int iPort = 2002; szHost = Edit->Text.c_str(); 然後呼叫ConnetServer(szHost, iPort); 連結卻會失敗; 接著我用另一種方式,宣告如下: char szHost[64]; int iPort = 2002; strcpy(szHost, Edit->Text.c_str()); 然後呼叫ConnetServer(szHost, iPort); 連結卻又可以成功; 請問各位前輩原因何在?謝謝!
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-10-22 10:31:05 IP:218.160.xxx.xxx 未訂閱
char *szHost; int iPort = 2002; szHost = Edit->Text.c_str(); 1.此指令是把 szHost 指標指向 .c_str() 所產生字串的位置 2.但很不幸的 .c_str() 所產生字串的位置馬上又歸還系統(free 掉), 如此系統又可能把此記憶體用來作其他用途. 3.你可追蹤下列程式,看看 szHost 和 ss 的變化 AnsiString ss = "888"; char *szHost = ss.c_str(); ss = "8"; 如此 szHost 值就變掉了.
gump996
一般會員


發表:10
回覆:8
積分:3
註冊:2002-10-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-10-22 18:37:51 IP:61.217.xxx.xxx 未訂閱
引言: char *szHost; int iPort = 2002; szHost = Edit->Text.c_str(); 1.此指令是把 szHost 指標指向 .c_str() 所產生字串的位置 2.但很不幸的 .c_str() 所產生字串的位置馬上又歸還系統(free 掉), 如此系統又可能把此記憶體用來作其他用途. 3.你可追蹤下列程式,看看 szHost 和 ss 的變化 AnsiString ss = "888"; char *szHost = ss.c_str(); ss = "8"; 如此 szHost 值就變掉了.
謝謝前輩的回答,我用如下的程式碼測試:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
     AnsiString as = "888";
     char *sz;         sz = as.c_str();
     Edit1->Text = AnsiString(sz);
}
但是我在Debug Inspector中看sz卻是: sz: char *:0063FCF8::011953E0 "888" 原因是在於c_str()還沒free嗎? 如果是的話,我要如何才能知道他何時會被free? 發表人 - gump996 於 2002/10/22 18:39:05
系統時間:2024-03-28 20:46:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!