首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

一段奇怪的代码,想来思去还是不明白解决办法

2012-03-06 
一段奇怪的代码,想来思去还是不明白char*test(char*text){stringtxttextintlentxt.length()char*Inne

一段奇怪的代码,想来思去还是不明白
char*   test(char*   text)
{
                string   txt=text;
                int   len=txt.length();
                char   *In=new   char[len];

                strcpy(In,txt.c_str());

                char   *Out=new   char[len];

                return   In;
}

void   __fastcall   TForm1::Button1Click(TObject   *Sender)
{

AnsiString   txt= "12345671234567123456712345671234 ";
Memo1-> Text=test(txt.c_str());

}

按上面这段代码执行,在我的机子上出来的结果是Memo1-> Text== "12345671234567123456712345671234& "。最后多一个“&”。但如果我将char*   test(char*   text)中的char   *Out=new   char[len];这一句移到紧接在char   *In=new   char[len]的后面就显示正常了。我想可能是new   char[len]的长度不够。

[解决办法]
char *In=new char[len+1];
[解决办法]
实际上char *结束必须设定\0;


[解决办法]
string txt=text;
int len=txt.length();
char *In=new char[len+1];
strcpy(In,txt.c_str());
假设text= "abc ";

那么text.Length() = 3
strlen(In) = 3 ;
可是要存放3個字符長的字符串卻要4個字節。額外的 '\0 '結束符

第二:如果程序中没有char *Out=new char[len];或是将它移到strcpy(In,txt.c_str());之前怎么不显示出错误结果?
因為 strcpy(In,txt.c_str()); 這句越界使用內存。 造成結果不可預測。把char *Out=new char[len];移到strcpy(In,txt.c_str());之前,出現問題的機會將會少些,那是因為一般系統分配內存的時候是連續分配的,剛好Out分配到的內存緊跟著In這塊內存後面的機會比較大,這時,strcpy(In,txt.c_str()); 這句越界使用內存,就剛好使用Out分配到的內存,產生結果正確的假象。

越界使用內存,使用野指針(未初始化的指針,已經delete的內存)都將造成結果不可預測。


热点排行