我听人家说这种用法不推荐在项目里使用,可能会出错,是这样吗?
还有我定义这个长度为0的数组的时候编译出错,定义一个长度为1的就OK,这是怎么回事?
还有我定义这个长度为0的数组的时候编译出错,定义一个长度为1的就OK,这是怎么回事?
解决方案 »
- Doc 里无法获得 Maifram 的控件指针
- CString对象中如何设置分配缓冲区大小
- 修改过后的缓存问题 socket
- [200]分很急的请问各位一个消息处理问题:PreTranslateMessage(MSG *pMsg),很急的请求帮助,谢谢!有两个同样的问题,解决马上结题;
- 50分求CTreeCtrl中插入图标的问题,在线等
- 我想从得到当前时间开始计算,等到十秒后,自动弹出一个消息,提示已经过了十秒了,该怎样写?
- 用VC编程怎样更换桌面上“我的电脑的图标”? 接分呀
- Invalid Address specified to RtlValidateHeap( 003A0000, 00E91F78 )
- 从“让CEdit响应我的键盘消息。”开始提问
- CTime只支持1970-2038?有什么好办法能够扩展此范围么?
- VC一个超简单的网络编程问题
- 代码问题 编译没有错误 运行后不显示图片 而且还有异常 应用程序发生异常unknown software exception(0x80000003),位置为0x7c921230 请帮忙看看
比如你现在要申请一个存放结构体实例(其中变长数组长度为N)的内存空间,你要申请多少字节的内存?
struct A
{
int nLen;
char pBuf[1];
};用VC编译时,如果编译时内存最大对齐模数设为默认,则要申请的内存字节数为:size_t nMaxAlign = sizeof(结构体中对齐要求最严格的类型);
size_t nVarAlign = sizeof(变长数组元素类型);
size_t nBufSize = sizeof(A) - nMaxAlign + (nVarAlign * N + nMaxAlign - 1) / nMaxAlign * nMaxAlign;1. 这个结构体中对齐要求最严格的类型是需要人工确定的,因此正确性很难保证。
2. 如果改变最大对齐模数,计算方法又会不同。
3. 如果这个数据要在两个分别编译的模块里使用,那么就很难保证其最大对齐模数设置相同,即很难保证读取到的是正确位置的数据。
{
BYTE *m_pA;
public:
A(BYTE *pA) : m_pA(pA) {} int Len() {return *(int *)m_pA;}
char Buf(size_t n = 0) {return *((char *)m_pA + sizeof(int) + n);}
};int asdf(BYTE *pMem)
{
A aaa(pMem);
int nLen = aaa.Len();
char Buf0 = aaa.Buf();
char Buf100 = aaa.Buf(100);
};
使用的时候把内存首地址往上面那个类里一套,就可以直接用了。要转到下一个对象,就增加一个成员函数:BYTE* Next() {return (char *)m_pA + sizeof(int) + Len();}