大家别犯lstrcpy和CString相关的如此低级错误,昨天累了几乎四小时……

Richuen22 2003-05-17 02:49:09
测试:
char sTemp[6];
UpdateData();
lstrcpy(sTemp, m_strPass); //m_strPass = "123456",在ClassWizrd中设为CString类型的,限制为6位,就是这个限制为6位迷惑了。

原意是想sTemp[5] = '6',但m_strPass最后的'\0'不要了,节省一个数组,结果导致数组超界,产生了一些意想不到的错误。竟将.h中的char m_sRecent[0][64]值冲掉了。

正确的:
char sTemp[7];
sTemp[6] = 'k'; //这个测试的
UpdateData();
lstrcpy(sTemp, m_strPass); //将m_strPass在ClassWizrd设为6位,大家看sTemp[6]是否不为'k'。

搞到要用Wasm32和Trw2000来查,看是那个冲掉了char m_sRecent[0][64],花了近四小时才找到真凶。
...全文
323 52 打赏 收藏 转发到动态 举报
写回复
用AI写文章
52 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChaoZhang 2003-05-24
  • 打赏
  • 举报
回复
还好没有用_tcscpy(m_strPass, chTemp),那才叫惨,如果不知道怎么回事的自己看看CString的源代码吧,学学人家的CString很不错的,而且在使用的时候就更自如了!
WvW 2003-05-24
  • 打赏
  • 举报
回复
反思中
newhand2000 2003-05-24
  • 打赏
  • 举报
回复
agree with USTCTony(Tony)
blacker 2003-05-19
  • 打赏
  • 举报
回复
可以使用StrCbCopyn来代替就基本上安全了.
eqiaotea 2003-05-19
  • 打赏
  • 举报
回复
内存是要吝啬一点,特别是从pc移植到硬件上,那可是一个字节一个字节的算啊.
tryber 2003-05-19
  • 打赏
  • 举报
回复
小的不才,一个月前就遇见这个问题了,msdn N 年前就说了,strcpy,wcscpy不查内存溢出,当源长度大于目标时...
还有,那些代码在unicode 下还是会出错.
一般我都用TCHAR和_tcscpy,使用之前来个检查.
VisualStudio 2003-05-19
  • 打赏
  • 举报
回复
知道了,谢谢
KcSoft 2003-05-19
  • 打赏
  • 举报
回复
遇过相同情况。
Richuen22 2003-05-19
  • 打赏
  • 举报
回复
另外补充CString的ReleaseBuffer(),如果是类变量或全局变量,这句就不成立
The buffer memory will be freed automatically when the CString object is destroyed.
这种情况下在CString的内容有变前就要加上ReleasBuffer()。
Panr 2003-05-18
  • 打赏
  • 举报
回复
要让它报错还不容易!


TCHAR tcBuffer1[8];
TCHAR tcBuffer2[8];

_tcscpy (tcBuffer1, _T("ABCDABCD"));
_tcscpy (tcBuffer2, _T("12341234"));

LPCTSTR dbg_pcszTemp1 = tcBuffer1;
LPCTSTR dbg_pcszTemp2 = tcBuffer2;
ASSERT (0!=dbg_pcszTemp1[0] && 0!=dbg_pcszTemp2[0]);
lshadow 2003-05-18
  • 打赏
  • 举报
回复
数组越界,这是显而易见的错误啊!
至于冲掉了char m_sRecent[0][64],我就不明白了……
xlander 2003-05-18
  • 打赏
  • 举报
回复
char szPassword[64];
char c = 0;
int i;
for(i = 0; i < sizeof(szPassword) - 1; i++)
szPassword[i] = 'a';
szPassword[sizeof(szPassword) - 1] = 0;
UpdateData(true);
lstrcpy(szPassword, m_str);
for(i = 7; i < sizeof(szPassword) - 1; i++)
{
c = szPassword[i];
ASSERT(c == 'a');
}
c = szPassword[sizeof(szPassword) - 1];
ASSERT(c == 0);
我按楼主的方法新建了一个工程,加了一个EDIT,限制长度是6。
这是我的测试代码,没有发现任何问题。各位看看是怎么回事?
allenhai1980 2003-05-18
  • 打赏
  • 举报
回复
mark
xiaoshao_0_0 2003-05-18
  • 打赏
  • 举报
回复
up!!
引以为戒
honey 2003-05-18
  • 打赏
  • 举报
回复
学习。
rogerfz 2003-05-18
  • 打赏
  • 举报
回复
建议以后大家把自己犯的一些值得注意的错误贴上来,大家一起学习,呵呵
yizhili 2003-05-18
  • 打赏
  • 举报
回复
学习!
USTCTony 2003-05-18
  • 打赏
  • 举报
回复
靠,这个不是所有的c++技巧上都有的吗。
开辟字符型数组的时候一定要加一的嘛。
这样的小tip也引得这么多关注,实在是
不可理喻。而且区区一个字节,根本就
不值得节省。多此一举。
程序的色彩 2003-05-18
  • 打赏
  • 举报
回复
学习!
再学习!
Richuen22 2003-05-18
  • 打赏
  • 举报
回复
还漏了一句:
The buffer memory will be freed automatically when the CString object is destroyed.
加载更多回复(32)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧