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