unsigned char inBuff[25],ouBuff[25],key1[16];
memset(inBuff,0,25);
memset(ouBuff,0,25);
memset(key1,0,16); CString message_key=_T("cxl"); memcpy(key1,message_key,16); for(i=0;i<16;i++)
AfxMessageBox(CString(key1[i])+"///");
程序输出:下划线表示输出为空
c///
x///
l///
_
?//
?//
?//
?//
_
_
_
_
_
_
_
_
_
memset(inBuff,0,25);
memset(ouBuff,0,25);
memset(key1,0,16); CString message_key=_T("cxl"); memcpy(key1,message_key,16); for(i=0;i<16;i++)
AfxMessageBox(CString(key1[i])+"///");
程序输出:下划线表示输出为空
c///
x///
l///
_
?//
?//
?//
?//
_
_
_
_
_
_
_
_
_
把CString的16个字节考过去了,那么后边就是CString的东西,是什么就不定了,你可以看下内存
message_key只有3个字符长度,当拷贝16个长度是,已经越界了,第三个字符以后的字符根本无法确认是什么
只将message_key.GetLength个字符拷贝到字符串中就可以了,程序中拷贝了16个字符,后面的字符没有意义
int nlen = message_key.GetLength()<16 ? message_key.GetLength() : 16;memcpy(key1,message_key,nlen);
在VCKBASE的第19期,看完这篇文章后,你会得到一个结论,即:
“在DEBUG 版下,四个FD就是内存的生死疆界”,也就是说,MFC通过额外四个FD来确定是否发生了内存越位!
现在回到现在的问题上,
当i=4时,对于表达式CString(key1[i])
执行前 0xFD0xFD0xFD0xFD
执行后 0xFD0x000xFD0xFD
CString并不是通吃的,实际上,这里已经产生了错误了,
接着 再 +"///",内存中是:
0xFD 0x2F 0x2F 0x2F 0x2F即'/'
那么,为什么只显示3个字符呢?
原因在于,以0xFD开头,系统则认为它可能是BIG5码,因此,系统认为,有3个字符,即(0xFD 0x2F) 0x2F 0x2F
而0xFD 0x2F并不在正常的 BIG5码范围内,因此显示了'?'
另外,由这个例子可以看出,系统(至少是MessageBox)在处理字符时,很可能是先判断一个BYTE,如果这个BYTE大于0x81,则认为是CJK码,而不管第二个BYTE是否有效,这算不算windows的BUG呢?
最后要说明的是,这段程序在release版下是不会出现这样的情况的,原因就在于"四个FD"