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)或靜態/全域記憶體,區域陣列不可回傳。 |
| 輸出參數 | 呼叫端分配緩衝區並傳入大小,函式負責填充,最安全、推薦。 |
回傳 CString | CString 內部管理記憶體,可安全回傳字串物件,避免指標陷阱。 |