CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

CString变量的最大长度不是2G吗?但我这样就出错

楼主daymist(土狼)2005-01-03 22:18:40 在 VC/MFC / 基础类 提问

CString变量的最大长度不是2G吗?但我这样写  
  CString   strTest(""   ,   nLen);  
  这个nLen大于64K左右时会运行出错。  
   
  我糊涂了 问题点数:50、回复次数:19Top

1 楼pomelowu(羽战士)回复于 2005-01-03 22:27:36 得分 2

不一定能分配那么大的空间啊……Top

2 楼ilovevc(ilovevc)回复于 2005-01-03 23:39:50 得分 20

不死才怪。  
  CString   strTest(""   ,   nLen);  
  调用的是  
  CString(LPCSTR   lpch,   int   nLength);    
  后面的参数表示lpch的长度,你这个""长度为0,你给了64K,都读到U盘了。Top

3 楼EnochShen(小疯子:真的好菜—知耻而后勇!)回复于 2005-01-03 23:55:06 得分 2

都读到U盘了  
  -------------  
  汗....^o^Top

4 楼delphihero(何去何从)回复于 2005-01-04 08:42:25 得分 2

CString   不用指定内存长度的Top

5 楼daymist(土狼)回复于 2005-01-04 08:43:51 得分 0

读到U盘了?  
  pch    
  A   pointer   to   an   array   of   characters   of   length   nLength,   not   null-terminated  
   
  我只是开了一个64K个BYTE长度的CString而已啊。  
   
  MSDN   上的例子:  
  CAtlString   s6(   'x',   6   );                     //   s6   =   "xxxxxx"  
   
   
  Top

6 楼daymist(土狼)回复于 2005-01-04 08:46:10 得分 0

我要指定长度是为了在后面调用GETBUFFER()进行数据拷贝的。  
   
  Top

7 楼uoyevoli(爱什么呢?www.FARPROC.com)回复于 2005-01-04 08:53:50 得分 2

运行出错,出什么错??具体一点啊。Top

8 楼jszj(老板说mis部不是赚钱的部门...)回复于 2005-01-04 09:20:10 得分 2

何必呢?  
  数据copy,就用CString.Fromat来做了,方便简单Top

9 楼koko1998(高价购买火车票)回复于 2005-01-04 09:20:41 得分 2

不一定能分配那么大的空间啊……  
   
  我想应该是这样的。  
  int   nLength   =   str.GetLength();  
  如果是2G的空间的话,不死才怪呢!  
  赫赫Top

10 楼koko1998(高价购买火车票)回复于 2005-01-04 09:25:11 得分 2

CStringT   inherits   from   CSimpleStringT   Class.   Advanced   features,   such   as   character   manipulation,   ordering,   and   searching,   are   implemented   by   CStringT.  
   
  Note       CStringT   objects   are   capable   of   throwing   exceptions.   This   occurs   when   a   CStringT   object   runs   out   of   memory   for   any   reason.  
  Top

11 楼sjhunter()回复于 2005-01-04 10:22:20 得分 2

下面是MSDN的source   code,看来64K跨段了,不能用这个构造函数  
  CString::CString(LPCTSTR   lpch,   int   nLength)  
  {  
  Init();  
  if   (nLength   !=   0)  
  {  
  ASSERT(AfxIsValidAddress(lpch,   nLength,   FALSE));  
  AllocBuffer(nLength);  
  memcpy(m_pchData,   lpch,   nLength*sizeof(TCHAR));  
  }  
  }  
  Top

12 楼yuhongwei(不会的太多)回复于 2005-01-04 10:30:19 得分 2

upTop

13 楼ilovevc(ilovevc)回复于 2005-01-04 10:40:24 得分 0

""的类型是const   char[1],会匹配const   char   *的构造函数,而不是你认为的char。  
   
  你可以如下:  
  CString   str('\0',   64   *   1024);  
   
  Top

14 楼Anikan(皮皮鱼)回复于 2005-01-04 10:45:19 得分 2

to   sjhunter():  
      64k跨段了,什么意思,你以为还在DOS啊。  
  to   ilovevc(ilovevc)  
        你写错了。  
      CString   strTest(""   ,   nLen);第一个参数LPCSTR长度为零,nLen有什么意思那,当然死了。  
  写成   CString   strTest('1',64000)或者第一个参数LPCSTR长度为64k   就可以了。  
  Top

15 楼daymist(土狼)回复于 2005-01-04 11:54:39 得分 0

CString   str('\0',   64   *   1024);确实是对的。  
   
  CString的构造函数不存在64K跨段问题,只是  
  CString   strTest(""   ,   64000);这样有问题。  
   
  我认为ilovevc的话没错。  
   
  但我还是不太明白第一位兄弟所言:读到U盘了.Top

16 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-01-04 12:06:16 得分 2

“   ”中间留个空格Top

17 楼ilovevc(ilovevc)回复于 2005-01-04 12:10:58 得分 0

假设我有一个字符串hello,world  
  我想将CString初始化为hello,只要前面的5个字符,那么可以  
  CString   str("hello,world",   5);  
  然后CString将从前面读5个字符,变成“hello",现在你给了一个"",实际长度算上结束字符才为1,然后欺骗CString说这个字符串至少有64k,那么就读出界了,也就是我说的都已经读到“u盘”了。  
   
  Top

18 楼bluestone(kulawa)回复于 2005-01-04 12:14:57 得分 4

使用CString(   TCHAR   ch,   int   nRepeat   =   1   );构造函数,如果使用CString(   LPCTSTR   lpch,   int   nLength   );那么nLength的长度要小于等于LPCTSTR   lpch;Top

19 楼sjhunter()回复于 2005-01-05 13:37:01 得分 4

Anikan(皮皮鱼)  
  不是什么DOS不DOS的问题,ASSERT(AfxIsValidAddress(lpch,   nLength,   FALSE));这句话死了,因为从内存地址lpch开始后64k已经是???,就是无效地址了,关键在于搂主想用CString('',   64*1024)来构造CString,   却将''错写成了"",如果nLength小,那么从lpch开始的nLength这么长的地址空间都是应用程序自己的,就不会死,太大就死了Top

相关问题

  • 两个CString变量相加为什么会出错?
  • 用Session传递变量出错
  • adodataset加变量查询sqlserver出错
  • Select语句中使用变量出错
  • Link 错误,外部变量出错
  • sql 中变量传递出错
  • byte 转CString 出错?
  • 如何将CComBSTR的变量转化成CString变量或lpsz变量
  • SHFileOperation操作:给pFrom赋值时加入变量就出错
  • 为什么定义变量的时候总是出错?

关键词

  • 函数
  • 字符
  • lpch
  • nlength
  • 长度
  • cstring
  • cstringt
  • ilovevc
  • 构造函数
  • strtest

得分解答快速导航

  • 帖主:daymist
  • pomelowu
  • ilovevc
  • EnochShen
  • delphihero
  • uoyevoli
  • jszj
  • koko1998
  • koko1998
  • sjhunter
  • yuhongwei
  • Anikan
  • oyljerry
  • bluestone
  • sjhunter

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo