 |
使用系统: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, 其他方面, 。
|
| |
|
| |
|
| |
|
|