[問題描述]
最近遇到一個問題我有一個函式GetTime函式回傳char*,
在GetTime函式中,要傳出去的變數currentTime值是非常正常的,
如下圖
但在外面接到的,卻變亂碼。
[解題思路]
我在想,是不是與陣列、指標的轉換有關,
雖然大家都說,陣列的名字就是指標,但實際上這兩個的運作方式不一樣。
google了一下,找到參考資料[1]的文章
[解決方法]
將currentTime變static即可
//char currentTime[200]; // 有機會出現亂碼
static char currentTime[200]; // OK
會造成這個的原因[1],是因為currentTime是在函式中宣告的,所以它的記憶體位置是在stack中,
(這個部分和程式的運作原理有關,一般變數都是在stack中,new或malloc的是在heap中)
當函式結束時,它就會被釋放掉,雖然有些編譯器會視是否要傳出去而做其他處理,
但這種寫法就是不穩定。
要解決這個問題,有兩個方法:
1.使用存活時間長一點的變數回傳,像是將currentTime設成static或const,或是使用在heap中的記憶體(用class或是malloc之類的來跟系統要求)。
2.改成從引數傳出。
下面提供其他做法
1.用new的方式,這樣就是在heap中,除非我們release,不然是不會消失
char* currentTime = new char[30];
...
2.使用std::string來傳遞
std::string GetTime()
{
std::string currentTime;
...
}
不過若是要寫函式庫給別人用,儘量不要用這種方法。
3. 若是是在class中,則可
const char* Class::GetTime() const
{
char currentTime[30];
...
return currentTime;
}
這個方法只適合用在非公開的方法中。
參考資料:
這封郵件來自 Evernote。Evernote 是您專屬的工作空間,免費下載 Evernote |
沒有留言:
張貼留言