日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

strcpy 通过指针复制字符串出错问题

發(fā)布時間:2025/3/17 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 strcpy 通过指针复制字符串出错问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

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

為何會出錯。

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

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

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

正確的寫法是這樣的:

?

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

?

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

strcpy_s(str1, size, str2);

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

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

_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; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/wuOverflow/p/4544204.html

總結(jié)

以上是生活随笔為你收集整理的strcpy 通过指针复制字符串出错问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。