C++中wcsncpy_s和wcsncpy

舒望星 2016-08-09 12:53:07

void Test(const wchar_t *test1)
{
wchar_t *newc = new wchar_t[wcslen(test1)];
wcsncpy_s(newc, wcslen(newc), test1, wcslen(test1));
//wcsncpy(newc, test1, wcslen(test1));
delete[] newc;
}


在这个里面 当我用wcsncpy的时候是可以正常delete[] newc的,但是我用wcsncpy_s后执行delete[] newc就会提示 Heap block at xxx modified at xxx past requested size

有没有大神能解答一下两者的区别嘛。
...全文
762 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-08-09
  • 打赏
  • 举报
回复
引用 2 楼 sdghchj 的回复:
忘了一点:申请字符内存后初始化常用的方法是:memset(newc,0,n * sizeof(wchar_t)); 或者拷贝完后强制一下末尾 newc[n-1] = 0;
我用 newc[n-1] = 0;
幻夢之葉 2016-08-09
  • 打赏
  • 举报
回复
wcsncpy_s(newc, wcslen(test1), test1, wcslen(test1));
sdghchj 2016-08-09
  • 打赏
  • 举报
回复
忘了一点:申请字符内存后初始化常用的方法是:memset(newc,0,n * sizeof(wchar_t)); 或者拷贝完后强制一下末尾 newc[n-1] = 0;
sdghchj 2016-08-09
  • 打赏
  • 举报
回复
newc申请内存后并没有进行初始化,其实际数据是乱的,也是不可预计的。所以wcslen(newc)的结果可大可小,一般是一个很大的数字,所以用wcsncpy_s越界概率很大。另外,C风格字符串一定要考虑终止符,否则也很可能刚好越界。 正确写法: size_t n = wcslen(test1)+1; // +1,包括终止符 wchar_t *newc = new wchar_t[n]; wcsncpy_s(newc, n,test1, n);
赵4老师 2016-08-09
  • 打赏
  • 举报
回复
带n的cpy函数是“安全”的。
舒望星 2016-08-09
  • 打赏
  • 举报
回复
引用 1楼sdghchj 的回复:
newc申请内存后并没有进行初始化,其实际数据是乱的,也是不可预计的。所以wcslen(newc)的结果可大可小,一般是一个很大的数字,所以用wcsncpy_s越界概率很大。另外,C风格字符串一定要考虑终止符,否则也很可能刚好越界。 正确写法: size_t n = wcslen(test1)+1; // +1,包括终止符 wchar_t *newc = new wchar_t[n]; wcsncpy_s(newc, n,test1, n);
试了一下 的确是这个问题,已经解决了!谢谢啦。但是还有一个问题是为什么不用_s的运行是能通过的

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧