首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ 回傳值:CString 與指標的差異與最佳實務

     編輯:C++ 入門

錯誤示範:回傳區域陣列指標

char *ReadLob(CString filename)
{
    char msgbody[1024];
    return msgbody; // 錯誤:回傳區域變數位址
}

此寫法將棧上區域陣列的位址回傳,函式結束後記憶體即失效,呼叫端取得的是野指標,行為未定義。

正確做法:呼叫端提供緩衝區

int ReadLob(CString filename, char* node702_msgbody, int iSz)
{
    std::ifstream file;
    file.open(filename);
    if (!file) {
        printf("Unable to open file\n");
        return -1;
    }
    char pBuf[1024*4];
    int iRead = 0, iCur = 0;
    while (!file.eof()) {
        file.read(pBuf, sizeof(pBuf));
        iRead = file.gcount();
        int iCpy = (iRead + iCur >= iSz) ? (iSz - iCur - 1) : iRead;
        strncpy(node702_msgbody + iCur, pBuf, iCpy);
        iCur += iCpy;
        if (iCur == sizeof(node702_msgbody) - 1) break;
    }
    node702_msgbody[iCur] = 0;
    return 0;
}

核心差異總結

方式說明
回傳指標必須指向動態配置(new)或靜態/全域記憶體,區域陣列不可回傳。
輸出參數呼叫端分配緩衝區並傳入大小,函式負責填充,最安全、推薦。
回傳 CStringCString 內部管理記憶體,可安全回傳字串物件,避免指標陷阱。
經驗之談:雖然第一種寫法在簡單測試中可能「碰巧」能跑(因棧框未被覆寫),但屬未定義行為,嚴禁用於正式程式碼。採用「呼叫端配置、被呼叫端填充」模式最穩健。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved