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