DWORD flags = 0; //标志
DWORD recvBytes =0; //发送字节数
ZeroMemory(&m_iIO, OVERLAPPEDPLUSLEN);
m_iIO.type = IOReadHead;//操作类型 WSABUF wsaBuf;
wsaBuf.buf = (char*)&m_iIO.hdr; //接收包头
wsaBuf.len = HEADELEN; //长度
//读取数据
if (WSARecv(m_s, 
&wsaBuf,
1, 
&recvBytes, 
&flags,
&m_iIO.overlapped,
NULL) == SOCKET_ERROR)
{
if(ERROR_IO_PENDING != WSAGetLastError())
{
return FALSE;
}
}
m_UserInfoPacketLen = m_iIO.hdr.usLen - sizeof(u_short);

m_UserInfoPacketLen是我声明的一个int变量,通过以上代码我显示了读取抱头的长度赋值给该变量,现在我要用这个变量来定义一个char的长度,但是
char cSN[m_UserInfoPacketLen]; 
memcpy(cSN, m_iIO.recvBuf + sizeof(u_short), m_UserInfoPacketLen);
编译有错误:error C2057: expected constant expression我想char cSN[m_UserInfoPacketLen];
m_UserInfoPacketLen必须是一个具体的值才可以吧,但是如何动态呢?

解决方案 »

  1.   

    用 new ,如 char cSN = new char[m_UserInfoPacketLen]
    就可以了,编译时动态分配
      

  2.   

    建议搜索一下内存分配的文章局部变量栈分配(系统自动分配),m_UserInfoPacketLen必需是常量
    或全局变量静态分配(编译时分配),m_UserInfoPacketLen必需是常量
    char cSN[m_UserInfoPacketLen]; 动态堆分配(运行时分配)
    char * cSN = new char[m_UserInfoPacketLen] 
      

  3.   

    new和malloc都可以动态分配。memcpy强制转换一下 void*
      

  4.   

    在栈上的数组声明,元素个数除非用常量,不然不能声明,因为每次开堆栈,栈顶指针要能准确的预留空间,比如,你声明了char a[100];栈顶指针esp将减去100字节的空间,留给a这个变量用,所以你得明确的指定要分配多少空间,CPU才能正确的移动esp指针:
            ---  <-栈基(ebp)
             |
             |   <-a的预留空间
              |
            ---  <-栈顶指针(esp)
    预留了a的空间,如果还有局部变量的声明,esp将继续向下移动来预留空间,如果你用变量动态指定这个元素个数,esp将不知道具体要预留多少空间,因为这个变量随时可以变,比如你char a[nCount];当nCount = 10的时候,esp将移动10个字节,如果你在一次程序执行的时候,nCount变成了20,esp又需要变成向下移动20个位置,这将导致你的元素覆盖了下一个局部变量的空间。而你的程序要是编译成.exe后,成为二进制硬编码的时候,栈就必须明确移动的字节数。
    这种情况下,你需要使用new操作符在堆上建立一个空间,因为堆上的空间不是像栈一样向下增长的(所有的局部变量都是排成一列紧挨着向着栈顶方向前进),c++会在内存中找到一块能容下你分配的字节数的空间给你用。