2020年7月22日 星期三

[Log Book] 解決函式回傳char*時,傳出去後出現亂碼

[問題描述]
最近遇到一個問題我有一個函式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

沒有留言:

張貼留言