执行strcpy\u时缓冲区太小
知道为什么我的代码片段在使用strcpy时抛出异常执行strcpy\u时缓冲区太小,c,windows,windows-7-x64,visual-studio-2010,C,Windows,Windows 7 X64,Visual Studio 2010,知道为什么我的代码片段在使用strcpy时抛出异常“Buffer is too small”,但如果我使用strcpy或CopyMemory则没有问题吗 WindowClass(LPCTSTR pszClassName, WNDPROC pfnWndProc) : m_pszClassName(0) { ... if( RegisterClass(&wc) ) { size_t cbClassName = strlen(pszClassName)
“Buffer is too small”
,但如果我使用strcpy或CopyMemory则没有问题吗
WindowClass(LPCTSTR pszClassName, WNDPROC pfnWndProc) : m_pszClassName(0)
{
...
if( RegisterClass(&wc) )
{
size_t cbClassName = strlen(pszClassName);
m_pszClassName = (LPTSTR)LocalAlloc(LPTR, cbClassName + 1);
if( m_pszClassName )
{
//strcpy(m_pszClassName, pszClassName);
strcpy_s(m_pszClassName, cbClassName, pszClassName);
//CopyMemory(m_pszClassName, pszClassName, cbClassName);
}
else
{
UnregisterClass(pszClassName, hinst);
}
}
}
目标是VS2012上不带UNICODE的Win7x64。m_pszClassName定义为什么?在传递size参数时,需要考虑空字符终止符的空间。也就是说,它需要与您的分配大小相同:
cbClassName+1
。API检测到字符串加上null字符没有空间,因此断言。从strcpy_s
上的MS文档中可以看到:“目标字符串必须足够大,以容纳源字符串,包括终止的空字符。”@WhozCraig:为什么不回答这个问题?@alk其实不是这样。。wordy,当我第一次开始输入它时(事实上,它只是“pass cbClasName+1”,有点失控=P)@PaulR LPTSTR m_pszClassName;