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