执行strcpy\u时缓冲区太小

执行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)

知道为什么我的代码片段在使用strcpy时抛出异常
“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;