发信人: ken_qian()
整理人: wenbobo(2002-12-06 22:08:55), 站内信件
|
初始化:虽然教科书上经常讲初始化、初始化,但我经常 只在定义指针的时候将它初始化为NULL,这样的习惯很 不好,但也不为什么就一直没有改,也许因为习惯使然吧。
不要将堆栈里的指针返回,我犯过如下错误: char * int2str(int i){ char str[20]; sprintf("%d",i); return str; } 我这么作,错误的原因就在于,编译器通常会在堆栈里分 配临时的存储空间给str这样的局部变量。当局部变量的作 用结束以后,编译器经常擅自将其挪作它用。我没有得到 我想要的,和应得的。那么,你实在想要str的地址的话, 传统作法是将str定义为static,那么编译器就会为其永久的 分配一块自留地。但是str将受严密的控制,其它函数不可 能直接访问str,虽然它始终存在。 好的解决方法是用缓冲区: char * int2str(int i,char * pBuffer,int nBufferSize){ .... return pBuffer; } 最好指明缓冲的大小,以便函数可以检测缓冲是否足够。
给字符串分配内存时,不要忘了最后的'\x0',C不提供数 组的边界检测,它相信你自己能作到这一点。那么不要 忘记留给字符串数组多留一个结束的标志。(我常犯的毛病)
Ken
10:42
-- 杀意隆目中神光咋现,一向清澄的眼眸中竟闪现出三分歹毒,四分杀意。
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.97.9.248] 发信人: crazyjava (骄傲的中国人), 信区: C 标 题: Re: 我碰到过的错误,你有没有碰到呢? 发信站: 网易虚拟社区 (Tue Jun 29 14:11:35 1999), 站内信件
【 在 ken_qian (<marquee>杀意隆) 的大作中提到: 】 : 初始化:虽然教科书上经常讲初始化、初始化,但我经常 : 只在定义指针的时候将它初始化为NULL,这样的习惯很 : 不好,但也不为什么就一直没有改,也许因为习惯使然吧。 : : .......
这也是我初学时常犯的错误,不过现在不会了。 你那种是其中一个流行的作法,而我习惯尽量减少 input parameters,所以以下是我的做法:
char * int2str(int i) { char str[20]; ::sprintf( str, "%d",i);
char *pBuffer = new char[ ::strlen( str ) + 1 ]; ::strcpy( pBuffer, str ); return pBuffer; }
若担心size of buffer是20太小,可以自己控制:
char * int2str( int i, int iBufferSize = 20 ) { char *pStr = new char[ iBufferSize + 1 ]; ::sprintf( pStr, "%d",i);
char *pBuffer = new char[ ::strlen( pStr ) + 1 ]; ::strcpy( pBuffer, pStr ); delete []pStr; return pBuffer; }
这样一来,自己就不用操心string的初始化等问题了, 而且也可以节省memory,因为若i=1,而buffer的size是20 的话就浪费了19个bytes.我让它在function内重新分配多 一次,就决定了实际需要的字节数。
请指正, thanks.
-- 孤身走我路... 其实,路,两个人一起走比一个人要好。 email: [email protected]
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 139.87.93.222] 发信人: ken_qian (<marquee>杀意隆), 信区: C 标 题: Re: 我碰到过的错误,你有没有碰到呢? 发信站: 网易虚拟社区 (Tue Jun 29 16:05:03 1999), 站内信件
我想说的是三件事 第一:变量申明时保持初始化的习惯。 第二:别把在函数里的局部变量指针作为返回值。 第三:再处理字符串数组时别忘了为'\x0'留个位置
Ken 16:59
-- ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.97.9.248] 发信人: literfer (老温), 信区: C 标 题: Re: 我碰到过的错误,你有没有碰到呢? 发信站: 网易虚拟社区 (Tue Jun 29 16:27:27 1999), 站内信件
【 在 crazyjava (骄傲的中国人) 的大作中提到: 】 : 【 在 ken_qian (<marquee>杀意隆) 的大作中提到: 】 : : 初始化:虽然教科书上经常讲初始化、初始化,但我经常 : : 只在定义指针的时候将它初始化为NULL,这样的习惯很 : : 不好,但也不为什么就一直没有改,也许因为习惯使然吧。 : .......
crazyjava兄的方法好是好,可是在使用了你的pBuffer后还得用delete删除,也 很烦的,是不是?
-- 任我独行
发信人: crazyjava (骄傲的中国人), 信区: C 标 题: Re: 我碰到过的错误,你有没有碰到呢? 发信站: 网易虚拟社区 (Tue Jun 29 16:45:35 1999), 站内信件
【 在 literfer (老温) 的大作中提到: 】 : 【 在 crazyjava (骄傲的中国人) 的大作中提到: 】 : : 【 在 ken_qian (<marquee>杀意隆) 的大作中提到: 】 : : ....... : : .......
我方法的使用例子: int i = 100; int iBufferSize = 10; char *p = int2str( i, iBufferSize ); ... delete [] p;
ken方法的使用例子: int i = 100; int iBufferSize = 10; char *p = new char[ iBufferSize + 1 ]; int2str( i, p, iBufferSize ); ... delete [] p;
不过对于指针变量,一般使用完后,都要delete. 难道你有更好的方法?
我想假如想要自动处理的话,只好笨一点,用 class. :P
class A { char *m_pBuffer; public: A() { m_pBuffer = NULL; } ~A() { if( m_pBuffer ) delete []m_pBuffer; }
char * int2str( int i, int iBufferSize = 20 ); };
char* A::int2str( int i, int iBufferSize ) { char *pStr = new char[ iBufferSize + 1 ]; ::sprintf( pStr, "%d",i);
if( m_pBuffer ) delete []m_pBuffer; m_pBuffer = new char[ ::strlen( pStr ) + 1 ]; ::strcpy( m_pBuffer, pStr ); delete []pStr; return m_pBuffer; }
example: int i = 100; A a; char *p = a.int2str( i ); ...
是不是有点小题大作 :P
-- 孤身走我路... 其实,路,两个人一起走比一个人要好。 email: [email protected]
※ 修改:.crazyjava 于 Jun 29 16:47:53 修改本文.[FROM: 139.87.93.222] ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 139.87.93.222] 发信人: vcc (vcc), 信区: C 标 题: Re: 我碰到过的错误,你有没有碰到呢? 发信站: 网易虚拟社区 (Tue Jun 29 18:29:47 1999), 站内信件
【 在 crazyjava (骄傲的中国人) 的大作中提到: 】 : 【 在 literfer (老温) 的大作中提到: 】 : : 【 在 crazyjava (骄傲的中国人) 的大作中提到: 】 : : : : ....... : ....... 想要偷懒还是有办法的^-^ const char* int2str(int i) { static char buf[20]; return(_itoa(i,buf,10)); }
-- 世事风云多变换 程序依然在我心
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.146.7] 发信人: YW (老GUN), 信区: C 标 题: Re: 我碰到过的错误,你有没有碰到呢? 发信站: 网易 BBS (Tue Jun 29 20:55:38 1999), 转信
绝对不可以把str定义为static, 否则如下调用就会出现错误:
a= int2str(100); b= int2str(200); //执行这句时同时把a的值也改成了"200"!!
【 在 ken_qian (<marquee>杀意隆) 的大作中提到: 】 : 初始化:虽然教科书上经常讲初始化、初始化,但我经常 : 只在定义指针的时候将它初始化为NULL,这样的习惯很
-- ※ 来源:.网易 BBS bbs.netease.com.[FROM: 202.103.137.27] 发信人: ken_qian (<marquee>杀意隆), 信区: C 标 题: Re: 我碰到过的错误,你有没有碰到呢? 发信站: 网易虚拟社区 (Wed Jun 30 08:03:13 1999), 站内信件
【 在 YW (老GUN) 的大作中提到: 】 : 绝对不可以把str定义为static, 否则如下调用就会出现错误: : a= int2str(100); : b= int2str(200); //执行这句时同时把a的值也改成了"200"!! : 【 在 ken_qian (<marquee>杀意隆) 的大作中提到: 】 : .......
a等于200是正常结果,我想我已经写得很清楚了,你用static分配的 是永久的内存(你的程序运行的时候),如果a的指向那块内存,那么 内存的内容变了,*a也变了正是正常的情况,不变我才觉得有些奇 怪。 我想我举这个例子,只是想告诉大家,不要把堆栈里的指针返回, 那是错的。
Ken
8:57
-- ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.97.9.248] 发信人: jaygee (jaygee), 信区: C 标 题: Re: 我碰到过的错误,你有没有碰到呢? 发信站: 网易虚拟社区 (Wed Jun 30 10:24:38 1999), 站内信件
【 在 ken_qian (<marquee>杀意隆) 的大作中提到: 】 : 初始化:虽然教科书上经常讲初始化、初始化,但我经常 : 只在定义指针的时候将它初始化为NULL,这样的习惯很 : 不好,但也不为什么就一直没有改,也许因为习惯使然吧。 : : .......
pbuffer已经是指针了,又何必再return呢?
-- ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.102.24.6] 发信人: crazyjava (骄傲的中国人), 信区: C 标 题: Re: 我碰到过的错误,你有没有碰到 发信站: 网易虚拟社区 (Tue Jun 29 19:21:28 1999), 站内信件 【 在 vcc (vcc) 的大作中提到: 】 : 【 在 crazyjava (骄傲的中国人) 的大作中提到: 】 : : 【 在 literfer (老温) 的大作中提到: 】 : : ....... : 想要偷懒还是有办法的^-^ : const char* int2str(int i) { : static char buf[20]; : return(_itoa(i,buf,10)); : } 哈哈,我们讨论的主要是char*的使用。若用itoa 我的写法还是: char * int2str(int i) { char str[20]; _itoa(i,str,10); char *pBuffer = new char[ ::strlen( str ) + 1 ]; ::strcpy( pBuffer, str ); return pBuffer; } 原因也是一个save memory :) -- 孤身走我路... 其实,路,两个人一起走比一个人要好。 email: [email protected] ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 139.87.93.222] 发信人: vcc (vcc), 信区: C 标 题: Re: 我碰到过的错误,你有没有碰到 发信站: 网易虚拟社区 (Wed Jun 30 10:15:59 1999), 站内信件 【 在 crazyjava (骄傲的中国人) 的大作中提到: 】 : 【 在 vcc (vcc) 的大作中提到: 】 : : 【 在 crazyjava (骄傲的中国人) 的大作中提到: 】 : : 想要偷懒还是有办法的^-^ :const char* int2str(int i) { : static char buf[20]; ^^^^^^^^ : return(_itoa(i,buf,10)); : } 看见static 没有?^-^ -- 世事风云多变换 程序依然在我心 ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.146.7] 发信人: crazyjava (骄傲的中国人), 信区: C 标 题: Re: 我碰到过的错误,你有没有碰到 发信站: 网易虚拟社区 (Wed Jun 30 10:21:55 1999), 站内信件 【 在 vcc (vcc) 的大作中提到: 】 : 【 在 crazyjava (骄傲的中国人) 的大作中提到: 】 : : 【 在 vcc (vcc) 的大作中提到: 】 : :const char* int2str(int i) { : : static char buf[20]; : ....... : 看见static 没有?^-^ 我个人不推荐使用static, 可免则免,因为浪费内存。 同时容易产生错误: const char* a = int2str( 100 ); // a = "100" const char* b = int2str( 200 ); // b = "200" 且 a = "200" (YW已经在前面指出过了) -- 孤身走我路... 其实,路,两个人一起走比一个人要好。 email: [email protected] ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 139.87.93.183] 发信人: YW (老GUN), 信区: C 标 题: Re: 我碰到过的错误,你有没有碰到 发信站: 网易 BBS (Wed Jun 30 10:53:07 1999), 转信 在函数内部使用辅助的全局变量首先碰到的一个问题就是该函数会 变成非线程安全的. 这意味着该函数将来在重用上会受到限制, 不小心 就会导致BUG的出现. 【 在 crazyjava (骄傲的中国人) 的大作中提到: 】 : 【 在 vcc (vcc) 的大作中提到: 】 : : 【 在 crazyjava (骄傲的中国人) 的大作中提到: 】 : : ....... : : 看见static 没有?^-^ : : 我个人不推荐使用static, 可免则免,因为浪费内存。 : 同时容易产生错误: : const char* a = int2str( 100 ); // a = "100" : const char* b = int2str( 200 ); // b = "200" 且 a = "200" : : (YW已经在前面指出过了) : -- ※ 来源:.网易 BBS bbs.netease.com.[FROM: 202.103.137.38] 发信人: vcc (vcc), 信区: C 标 题: Re: 我碰到过的错误,你有没有碰到 发信站: 网易虚拟社区 (Wed Jun 30 11:12:49 1999), 站内信件 【 在 YW (老GUN) 的大作中提到: 】 : 在函数内部使用辅助的全局变量首先碰到的一个问题就是该函数会 : 变成非线程安全的. 这意味着该函数将来在重用上会受到限制, 不小心 : 就会导致BUG的出现. : 【 在 crazyjava (骄傲的中国人) 的大作中提到: 】 : ....... 我完全同意你们的看法,我也认为用到str最好strdup一个,编程不应该偷懒 当然,也可以考虑用CString,这样就没问题了: CString int2str(int i){ char buf[20]; return(CString(_itoa(i,buf,10))); } -- 世事风云多变换 程序依然在我心 ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.146.7]
|
|