Code Bye

C++中wcsncpy_s和wcsncpy

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
有没有高手能解答一下两者的区别嘛。

解决方案

10

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);

10

忘了一点:申请字符内存后初始化常用的方法是:memset(newc,0,n * sizeof(wchar_t));
或拷贝完后强制一下末尾 newc[n-1] = 0;

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C++中wcsncpy_s和wcsncpy