读书人

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

发布时间: 2012-03-06 20:47:55 作者: rapoo

一段奇怪的代码,想来思去还是不明白
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的存)都造成果不可。


读书人网 >C++ Builder

热点推荐