软件注册站
热情软件屋

 
使用_strdate( )函数强行在c3s数组后加长长度是否可以
编号: QA004517    
建立日期: 2002年1月20日 最后修改日期: 2003年12月28日
所属类别: C/C++ - 其他方面
   
    使用系统:WIN2000
    使用软件:VC6
    1/
     char c3s[] = {'j','\0'};
     _strdate(c3s);
    当我使用以上语句时,能顺利通过,_strdate( )函数强行在c3s数组后加长长度:
     /* store seperators */
     buffer[2] = buffer[5] = _T('/');
     /* store end of string */
     buffer[8] = _T('\0');
     /* store tens of month */
     buffer[0] = (_TSCHAR) (month / 10 + _T('0'));
     /* store units of month */
     buffer[1] = (_TSCHAR) (month % 10 + _T('0'));
     /* store tens of day */
     buffer[3] = (_TSCHAR) (day / 10 + _T('0'));
     /* store units of day */
     buffer[4] = (_TSCHAR) (day % 10 + _T('0'));
     /* store tens of year */
     buffer[6] = (_TSCHAR) (year / 10 + _T('0'));
     /* store units of year */
     buffer[7] = (_TSCHAR) (year % 10 + _T('0'));
    
     return buffer;
    buffer 是 c3s 数组的指针, 这样做法合法吗? 会不会对内存造成破坏?请多多赐教!
    2/ char ar[ ] = {'a','b','c','d','e','f','\0'};
     char *p = ar;
     p[3] = ' \0 ' ;
     ar 数组给截断了,它的后面部分是不是给丢失泄漏了,会不会对内存造成破坏?
    请多多赐教! 水平:初级
    水平:初级 (yzp)
   
    1/ 你这样做会导致错误,是不行的。你在定义c3s只提供了2个字符的大小,而strdate并不会增加c3s的大小。有的情况下,执行到strdate就可能导致GPF错误,而有的时候,你这段程序可以正常执行,但稍后可能在其他地方出错。
    2/ 你这样做不会造成内存泄露。因为你定义的时候ar的大小为7个字符,而VC++在释放内存时根据的是你定义的大小,而不是释放到'\0'截止。
    
    刘志用的意见:
    这个问题很简单,因为你使用的是char c3s[] = {'j','\0'}; 在编译时就分配好了空间,这一不可变的了。但也不全是,你也可用Realloc()函数重新分配。
    你把长度大于上面的字符数组中去,不但会使数据丢失,很可能会很操作系统都挂了。
    如果你真的要方便使用,你可以使用Cstring,这封装的更好并且有很多成员函数,支持自动扩展,自动回收空间,这样写出的系统更稳定。
    Cstring存入的数据是UCODE,而char是ASCII码。Cstring可以支持很多类型的转换,转换的方法也很多,如Cstring::Format();而char我最常用的是spritf()进行转换,如果你有更好的方法请告诉我。

    

此问题由李海回答。

附加关键字:编程, 源程序, programming, source code, C/C++, MFC, C++ Builder, Borland C++, Turbo C, C, BCB, 其他方面,

   
 
把这个问题推荐给朋友
   
 
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio