2016-05-31 53 views
0

我試圖從一個函數返回一個字符串,像這樣:返回一個字符串,但得到的垃圾

virtual const char* what() const throw() 
{ 
    std::string str = "Name Error: name "; 
    str+= n_name; 
    str += " is not defined"; 
    char ret[256]=""; 
    const char* temp = str.c_str(); 
    strcpy(ret, temp); 
    return ret; 
} 

但是,當我嘗試打印它在另一個地方:

const char* str= exc.what(); 
std::cout << str; 

輸出是垃圾。

我認爲這個問題是的char [],它應該是char *,但是當我把它改爲

char* ret=""; 

程序崩潰的

strcpy(ret, temp); 

有人可以幫我嗎? P.S.該函數返回一個const char *

+1

您返回指向無效內存的指針。您需要分配一些指針將指向的內存。請參閱'malloc'或'new []'。 – ZunTzu

回答

0

因一時what()回報和返回值被存儲到str陣列ret將被銷燬,因爲它的範圍和這個指針從what()返回是一個懸擺指針導致undefined bevahiour deremissencing。你應該使用new這個數組(或者使用它後的delete)或者只是返回std::string

+0

謝謝我找到了一種方法! – alonpeer12345

0

主要問題來自返回指向局部變量的指針。如果使用-Wall編譯器選項(我鼓勵你在使用你所做的每編譯),您將獲得:

警告:局部變量「RET」的地址返回[-Wreturn-本地地址]

實際上,char ret[256]="";是局部功能。在函數結束時,局部變量不再存在。所以,當執行std::cout << str;時,指針內存不再存在。

當您使用char* ret="";時,您不分配內存。你只需要一個指針指向一個只讀的靜態內存,其中包含""。始終與-Wall選項,你會得到它說,你正在做的事情錯了一個警告:

警告:ISO C++,不允許字符串常量轉換「的char *」 [-Wwrite串]

你必須分配內存:

char * ret = new char[str.size()+1]; 

,但照顧,每個new必須有某處delete =>每手動分配的內存應該手動釋放

+0

你確定char ret [256] =「」分配內存嗎?它與指向只讀靜態內存的char * ret =「」有什麼不同? – ZunTzu

+0

'char ret [256] =「」'自動爲堆棧分配256個字符並將其初始化爲'「」''。取消分配在功能 – Garf365

+0

結束時自動完成非常感謝!它現在有效! – alonpeer12345

0

它看起來像你試圖實現一個例外。你爲什麼不繼承std::runtime_error這已經提供了機器來完成這項工作?你只需要將你想要的消息傳遞給它的構造函數。

請參閱http://en.cppreference.com/w/cpp/error/runtime_error

+0

這是創建異常任務的一部分。無論如何感謝 – alonpeer12345

+0

如果你問到你真正的問題,你可能會得到更好的答案。但我認爲你可能會覺得這很有用:http://stackoverflow.com/a/134612/212870 –