strcpy 通過指針復制字符串出錯問題


還是 C++ 吧里的一個問題, 問題是這樣的:

char* p = "shen me gui"; char* q = "hehe"; strcpy(p, q);

為何會出錯。

我當時其實也是挺奇怪, 主要我入門就是 C++ 11 標准, string 用慣了。

后來問題解決了, 是因為如此初始化的指針是一個常量指針, 所以對它們操作自然就錯了。

我現在一想起來就覺得惡心, 常量你咋就沒 const 呢?

正確的寫法是這樣的:

 

char str1[] = "shen me gui"; char str2[] = "hehe"; strcpy(str1, str2);

 

所以……到這就結束了嗎?當然不是!如果你用的和我一樣都是 VS 2013 的話, 你可能也會發現在 Debug 模式下, 上面的代碼是不會成功的, 因為編譯器會建(qiang)議(po) 你使用 strcpy_s, 用就用唄, 結果發現需要的是三個參數, 更惡心的是, 對於中間的參數還有要求:

strcpy_s(str1, size, str2);

問題就是出在這個 size 上面了, 填多少呢? 實際上, 填少了填多了都會導致內存泄漏, 編譯器會 duang 的一聲提醒你, 十分之不爽。

那么, 多少合適呢? 答案是 str2 的 size。至於為什么呢? 我想看了 vs 2013 里的實現你可能就明白了:

_FUNC_PROLOGUE errno_t __cdecl _FUNC_NAME(_CHAR *_DEST, size_t _SIZE, const _CHAR *_SRC) { _CHAR *p; size_t available; /* validation section */ _VALIDATE_STRING(_DEST, _SIZE); _VALIDATE_POINTER_RESET_STRING(_SRC, _DEST, _SIZE); p = _DEST; available = _SIZE; while ((*p++ = *_SRC++) != 0 && --available > 0) { } if (available == 0) { _RESET_STRING(_DEST, _SIZE); _RETURN_BUFFER_TOO_SMALL(_DEST, _SIZE); } _FILL_STRING(_DEST, _SIZE, _SIZE - available + 1); _RETURN_NO_ERROR; }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM