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

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