??xml version="1.0" encoding="utf-8" standalone="yes"?>久久精品国产一区二区三区不卡,久久久久99精品成人片欧美 ,亚洲国产精品成人久久http://m.shnenglu.com/yishanhante/category/3655.htmlzh-cnTue, 20 May 2008 21:12:39 GMTTue, 20 May 2008 21:12:39 GMT60C++内存理详解Q三Q?/title><link>http://m.shnenglu.com/yishanhante/articles/18965.html</link><dc:creator>jay</dc:creator><author>jay</author><pubDate>Sun, 25 Feb 2007 06:42:00 GMT</pubDate><guid>http://m.shnenglu.com/yishanhante/articles/18965.html</guid><wfw:comment>http://m.shnenglu.com/yishanhante/comments/18965.html</wfw:comment><comments>http://m.shnenglu.com/yishanhante/articles/18965.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/yishanhante/comments/commentRss/18965.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/yishanhante/services/trackbacks/18965.html</trackback:ping><description><![CDATA[ <div> <strong> <span style="FONT-SIZE: 14pt">7</span> </strong> <strong> <span style="FONT-SIZE: 14pt">、内存耗尽怎么办?</span> </strong> </div> <div style="TEXT-INDENT: 21pt">如果在申请动态内存时找不到够大的内存块Qmalloc和new返回NULL指针Q宣告内存申请失败。通常有三U方式处理“内存耗尽”问题? <table height="250" cellspacing="0" cellpadding="0" width="300" align="right" summary="" border="0"><tbody><tr><td> (tng) <script type="text/javascript"><!-- google_ad_client = "pub-2299987709779770"; google_ad_width = 300; google_ad_height = 250; google_ad_format = "300x250_as"; google_ad_type = "text_image"; google_ad_channel =""; google_color_border = "FFFFFF"; google_color_bg = "FFFFFF"; google_color_link = "0000FF"; google_color_url = "008000"; google_color_text = "000000"; //--></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script></td></tr></tbody></table></div> <div style="TEXT-INDENT: 21pt"> (tng)</div> <div style="TEXT-INDENT: 21pt">Q?Q判断指针是否ؓ(f)NULLQ如果是则马上用return语句l止本函数。例如:(x)</div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>void Func(void)<br />{<br /> A *a = new A;<br /> if(a == NULL)<br /> {<br />  return;<br /> }<br /> ?br />}<br /><br /></div> </td> </tr> </tbody> </table> <div style="TEXT-INDENT: 21pt">Q?Q判断指针是否ؓ(f)NULLQ如果是则马上用exit(1)l止整个E序的运行。例如:(x)</div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>void Func(void)<br />{<br /> A *a = new A;<br /> if(a == NULL)<br /> {<br />  cout << “Memory Exhausted?<< endl;<br />  exit(1);<br /> }<br /> ?br />}</div> </td> </tr> </tbody> </table> <div style="TEXT-INDENT: 21pt"> (tng)</div> <div style="TEXT-INDENT: 21pt"> (tng)</div> <div style="TEXT-INDENT: 21pt">Q?Qؓ(f)new和malloc讄异常处理函数。例如Visual C++可以用_set_new_hander函数为new讄用户自己定义的异常处理函敎ͼ也可以让malloc享用与new相同的异常处理函数。详l内容请参考C++使用手册?br /><br />  上述Q?Q(2Q方式用最普遍。如果一个函数内有多处需要申请动态内存,那么方式Q?Q就昑־力不从心(j)Q释攑ֆ存很ȝ(ch)Q,应该用方式(2Q来处理?br /><br />  很多Z忍心(j)用exit(1)Q问Q“不~写出错处理E序Q让操作pȝ自己解决行不行??br /><br />  不行。如果发生“内存耗尽”这L(fng)事情Q一般说来应用程序已l无药可救。如果不用exit(1) 把坏E序杀死,它可能会(x)x(chng)操作pȝ。道理如同:(x)如果不把歹徒?yn)LQ歹徒在老死之前?x)犯下更多的|?br /><br />  有一个很重要的现象要告诉大家。对?2位以上的应用E序而言Q无论怎样使用malloc与newQ几乎不可能D“内存耗尽”。我在Windows 98下用Visual C++~写?jin)测试程序,见示?。这个程序会(x)无休止地q行下去Q根本不?x)终止。因?2位操作系l支持“虚存”,内存用完?jin),自动用硬盘空间顶ѝ我只听到硬盘嘎吱嘎吱地响,W(xu)indow 98已经累得寚w盘、鼠标毫无反应?br /><br />  我可以得?gu)么一个结论:(x)对于32位以上的应用E序Q“内存耗尽”错误处理程序毫无用处。这下可把Unix和W(xu)indowsE序员(sh)乐坏?jin)?x)反正错误处理E序不v作用Q我׃写了(jin)Q省?jin)很多麻烦(ch)?br /><br />  我不惌D者,必须Q不加错误处理将DE序的质量很差,千万不可因小失大?/div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>void main(void)<br />{<br /> float *p = NULL;<br /> while(TRUE)<br /> {<br />  p = new float[1000000];<br />  cout << “eat memory?<< endl;<br />  if(p==NULL)<br />   exit(1);<br /> }<br />}<br /><br />  CZ7试图耗尽操作pȝ的内?/div> </td> </tr> </tbody> </table> <div> (tng)</div> <div>8、malloc/free 的用要?br /><br />  函数malloc的原型如下:(x)<br /><br /><br /></div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>void * malloc(size_t size);</div> </td> </tr> </tbody> </table> <div> <br /> <br />  用malloc甌一块长度ؓ(f)length的整数类型的内存Q程序如下:(x)<br /><br /><br /></div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>int *p = (int *) malloc(sizeof(int) * length);</div> </td> </tr> </tbody> </table> <div> <br /> <br />  我们应当把注意力集中在两个要素上Q“类型{换”和“sizeof”?br /><br />  * mallocq回值的cd是void *Q所以在调用malloc时要昑ּ地进行类型{换,void * 转换成所需要的指针cd?br /><br />  * malloc函数本nq不识别要申L(fng)内存是什么类型,它只兛_(j)内存的d节数。我们通常C住int, float{数据类型的变量的确切字节数。例如int变量?6位系l下?个字节,?2位下?个字节;而float变量?6位系l下?个字节,?2位下也是4个字节。最好用以下E序作一ơ测试:(x)<br /><br /><br /></div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>cout << sizeof(char) << endl;<br />cout << sizeof(int) << endl;<br />cout << sizeof(unsigned int) << endl;<br />cout << sizeof(long) << endl;<br />cout << sizeof(unsigned long) << endl;<br />cout << sizeof(float) << endl;<br />cout << sizeof(double) << endl;<br />cout << sizeof(void *) << endl;</div> </td> </tr> </tbody> </table> <div> <br /> <br />  在malloc的?)”中使用sizeofq算W是良好的风|但要当心(j)有时我们?x)昏了(jin)头Q写?p = malloc(sizeof(p))q样的程序来?br /><br />  * 函数free的原型如下:(x)<br /><br /><br /></div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>void free( void * memblock );</div> </td> </tr> </tbody> </table> <div> <br /> <br />  Z么free 函数不象malloc函数那样复杂呢?q是因ؓ(f)指针p的类型以?qing)它所指的内存的容量事先都是知道的Q语句free(p)能正地释放内存。如果p?NULL指针Q那么free对p无论操作多少ơ都不会(x)出问题。如果p不是NULL指针Q那么free对pq箋(hu)操作两次׃(x)DE序q行错误?br /><br /><strong><span style="FONT-SIZE: 14pt">9</span></strong><strong><span style="FONT-SIZE: 14pt">?/span></strong><strong><span style="FONT-SIZE: 14pt">new/delete </span></strong><strong><span style="FONT-SIZE: 14pt">的用要?/span></strong></div> <div>  q算Wnew使用h要比函数malloc单得多,例如Q?br /><br /><br /></div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>int *p1 = (int *)malloc(sizeof(int) * length);<br />int *p2 = new int[length];</div> </td> </tr> </tbody> </table> <div> <br /> <br />  q是因ؓ(f)new内置?jin)sizeof、类型{换和cd安全(g)查功能。对于非内部数据cd的对象而言Qnew在创建动态对象的同时完成?jin)初始化工作。如果对象有多个构造函敎ͼ那么new的语句也可以有多UŞ式。例?br /><br /><br /></div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>class Obj<br />{<br /> public :<br />  Obj(void); // 无参数的构造函?br />  Obj(int x); // 带一个参数的构造函?br />  ?br />}<br />void Test(void)<br />{<br /> Obj *a = new Obj;<br /> Obj *b = new Obj(1); // 初gؓ(f)1<br /> ?br /> delete a;<br /> delete b;<br />}<br /><br /></div> </td> </tr> </tbody> </table> <div> <br />  如果用new创徏对象数组Q那么只能用对象的无参数构造函数。例?br /><br /><br /></div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>Obj *objects = new Obj[100]; // 创徏100个动态对?/div> <div>  不能写成<br />Obj *objects = new Obj[100](1);// 创徏100个动态对象的同时赋初?</div> </td> </tr> </tbody> </table> <div> <br />  在用delete释放对象数组Ӟ留意不要丢了(jin)W号‘[]’。例?br /><br /><br /></div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #f3f3f3; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>delete []objects; // 正确的用?br />delete objects; // 错误的用?/div> </td> </tr> </tbody> </table> <div> <br /> <br />  后者相当于delete objects[0]Q漏掉了(jin)另外99个对象?br /><br /><strong><span style="FONT-SIZE: 14pt">10</span></strong><strong><span style="FONT-SIZE: 14pt">、一些心(j)得体?/span></strong></div> <div style="TEXT-INDENT: 21pt">我认识不技术不错的C++/CE序员,很少有h能拍拍胸脯说通晓指针与内存管理(包括我自己)(j)。我最初学?fn)C语言时特别怕指针,D我开发第一个应用YӞU?万行C代码Q时没有使用一个指针,全用数组来顶替指针,实在蠢笨得过分。躲避指针不是办法,后来我改写了(jin)q个软gQ代码量~小到原先的一半?br />  我的l验教训是:(x)</div> <div style="TEXT-INDENT: 21pt">Q?Q越是怕指针,p要用指针。不?x)正用指针,肯定不上是合格的程序员?/div> <div style="TEXT-INDENT: 21pt">Q?Q必d成“用调试器逐步跟踪E序”的?fn)惯Q只有这h能发现问题的本质?br /></div> <img src ="http://m.shnenglu.com/yishanhante/aggbug/18965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/yishanhante/" target="_blank">jay</a> 2007-02-25 14:42 <a href="http://m.shnenglu.com/yishanhante/articles/18965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++内存理详解Q二Q?/title><link>http://m.shnenglu.com/yishanhante/articles/18957.html</link><dc:creator>jay</dc:creator><author>jay</author><pubDate>Sat, 24 Feb 2007 15:43:00 GMT</pubDate><guid>http://m.shnenglu.com/yishanhante/articles/18957.html</guid><wfw:comment>http://m.shnenglu.com/yishanhante/comments/18957.html</wfw:comment><comments>http://m.shnenglu.com/yishanhante/articles/18957.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/yishanhante/comments/commentRss/18957.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/yishanhante/services/trackbacks/18957.html</trackback:ping><description><![CDATA[ <div> <strong> <span style="FONT-SIZE: 14pt">4</span> </strong> <strong> <span style="FONT-SIZE: 14pt">、指针参数是如何传递内存的Q? <table height="250" cellspacing="0" cellpadding="0" width="300" align="right" summary="" border="0"><tbody><tr><td> (tng) <script type="text/javascript"><!-- google_ad_client = "pub-2299987709779770"; google_ad_width = 300; google_ad_height = 250; google_ad_format = "300x250_as"; google_ad_type = "text_image"; google_ad_channel =""; google_color_border = "FFFFFF"; google_color_bg = "FFFFFF"; google_color_link = "0000FF"; google_color_url = "008000"; google_color_text = "000000"; //--></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script></td></tr></tbody></table></span> </strong> </div> <div style="TEXT-INDENT: 21pt">如果函数的参数是一个指针,不要指望用该指针ȝ请动态内存。示?-4-1中,Test函数的语句GetMemory(str, 200)q没有str获得期望的内存,str依旧是NULLQؓ(f)什?</div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e6e6e6; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>void GetMemory(char *p, int num)<br />{<br /> p = (char *)malloc(sizeof(char) * num);<br />}<br />void Test(void)<br />{<br /> char *str = NULL;<br /> GetMemory(str, 100); // str 仍然?NULL<br /> strcpy(str, "hello"); // q行错误<br />}<br />      CZ4.1 试图用指针参数申请动态内?/div> </td> </tr> </tbody> </table> <div style="TEXT-INDENT: 21pt"> (tng)</div> <div style="TEXT-INDENT: 21pt">毛病出在函数GetMemory中。编译器L要ؓ(f)函数的每个参数制作(f)时副本,指针参数p的副本是 _pQ编译器?_p = p。如果函C内的E序修改?jin)_p的内容,导致参数p的内容作相应的修攏V这是指针可以用作输出参数的原因。在本例中,_p甌?jin)新的内存,只是?_p所指的内存地址改变?sh)(jin),但是p丝毫未变。所以函数GetMemoryq不能输ZQ何东ѝ事实上Q每执行一ơGetMemory׃(x)泄露一块内存,因ؓ(f)没有用free释放内存?br /><br />  如果非得要用指针参数ȝ请内存,那么应该改用“指向指针的指针”,见示?.2?/div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e6e6e6; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>void GetMemory2(char **p, int num)<br />{<br /> *p = (char *)malloc(sizeof(char) * num);<br />}<br />void Test2(void)<br />{<br /> char *str = NULL;<br /> GetMemory2(&str, 100); // 注意参数?&strQ而不是str<br /> strcpy(str, "hello");<br /> cout<< str << endl;<br /> free(str);<br />}<br />      CZ4.2用指向指针的指针甌动态内?/div> </td> </tr> </tbody> </table> <div style="TEXT-INDENT: 21pt"> (tng)</div> <div style="TEXT-INDENT: 21pt"> (tng)</div> <div style="TEXT-INDENT: 21pt">׃“指向指针的指针”这个概念不Ҏ(gu)理解Q我们可以用函数q回值来传递动态内存。这U方法更加简单,见示?.3?br /><br /></div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e6e6e6; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>char *GetMemory3(int num)<br />{<br /> char *p = (char *)malloc(sizeof(char) * num);<br /> return p;<br />}<br />void Test3(void)<br />{<br /> char *str = NULL;<br /> str = GetMemory3(100);<br /> strcpy(str, "hello");<br /> cout<< str << endl;<br /> free(str);<br />}<br />       CZ4.3 用函数返回值来传递动态内?/div> </td> </tr> </tbody> </table> <div style="TEXT-INDENT: 21pt"> (tng)</div> <div style="TEXT-INDENT: 21pt">用函数返回值来传递动态内存这U方法虽然好用,但是常常有h把return语句用错?jin)。这里强调不要用return语句q回指向“栈内存”的指针Q因内存在函数结束时自动消亡Q见CZ4.4?/div> <div style="TEXT-INDENT: 21pt"> (tng)</div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e6e6e6; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>char *GetString(void)<br />{<br /> char p[] = "hello world";<br /> return p; // ~译器将提出警告<br />}<br />void Test4(void)<br />{<br /> char *str = NULL;<br /> str = GetString(); // str 的内Ҏ(gu)垃圾<br /> cout<< str << endl;<br />}<br />      CZ4.4 return语句q回指向“栈内存”的指针</div> </td> </tr> </tbody> </table> <div style="TEXT-INDENT: 21pt"> (tng)</div> <div style="TEXT-INDENT: 21pt"> (tng)</div> <div style="TEXT-INDENT: 21pt">用调试器逐步跟踪Test4Q发现执行str = GetString语句后str不再是NULL指针Q但是str的内容不是“hello world”而是垃圾?br />如果把示?.4改写成示?.5Q会(x)怎么P<br /><br /></div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e6e6e6; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>char *GetString2(void)<br />{<br /> char *p = "hello world";<br /> return p;<br />}<br />void Test5(void)<br />{<br /> char *str = NULL;<br /> str = GetString2();<br /> cout<< str << endl;<br />}<br />     CZ4.5 return语句q回帔R字符?br /><br /></div> </td> </tr> </tbody> </table> <div style="TEXT-INDENT: 21pt"> <br /> <br />  函数Test5q行虽然不会(x)出错Q但是函数GetString2的设计概念却是错误的。因为GetString2内的“hello world”是帔R字符Ԍ位于?rn)态存储区Q它在程序生命期内恒定不变。无Z么时候调用GetString2Q它q回的始l是同一个“只诠Z的内存块?/div> <div style="TEXT-INDENT: 21pt"> (tng)</div> <div> <strong> <span style="FONT-SIZE: 14pt">5</span> </strong> <strong> <span style="FONT-SIZE: 14pt">、杜l?/span> </strong> <strong> <span style="FONT-SIZE: 14pt">?/span> </strong> <strong> <span style="FONT-SIZE: 14pt">野指?/span> </strong> <strong> <span style="FONT-SIZE: 14pt">?/span> </strong> </div> <div style="TEXT-INDENT: 21pt"> (tng)</div> <div style="TEXT-INDENT: 21pt">“野指针”不是NULL指针Q是指向“垃䏀内存的指针。h们一般不?x)错用NULL指针Q因为用if语句很容易判断。但是“野指针”是很危险的Qif语句对它不v作用?“野指针”的成因主要有两U:(x)<br /><br />  Q?Q指针变量没有被初始化。Q何指针变量刚被创建时不会(x)自动成ؓ(f)NULL指针Q它的缺省值是随机的,它会(x)乱指一气。所以,指针变量在创建的同时应当被初始化Q要么将指针讄为NULLQ要么让它指向合法的内存。例?br /><br /><br /></div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e6e6e6; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>char *p = NULL;<br />char *str = (char *) malloc(100);</div> </td> </tr> </tbody> </table> <div style="TEXT-INDENT: 21pt"> <br /> <br />  Q?Q指针p被free或者delete之后Q没有置为NULLQ让以ؓ(f)p是个合法的指针?br /><br />  Q?Q指针操作超了(jin)变量的作用范围。这U情况让人防不胜ԌCZE序如下Q?br /><br /></div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e6e6e6; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>class A<br />{<br /> public:<br />  void Func(void){ cout << “Func of class A?<< endl; }<br />};<br />void Test(void)<br />{<br /> A *p;<br /> {<br />  A a;<br />  p = &a; // 注意 a 的生命期<br /> }<br /> p->Func(); // p是“野指针?br />}<br /><br /></div> </td> </tr> </tbody> </table> <div style="TEXT-INDENT: 21pt"> <br /> <br />  函数Test在执行语句p->Func()Ӟ对象a已经消失Q而p是指向a的,所以p成?jin)“野指针”。但奇怪的是我q行q个E序时居然没有出错,q可能与~译器有兟?br /><br /><strong><span style="FONT-SIZE: 14pt">6</span></strong><strong><span style="FONT-SIZE: 14pt">、有?/span></strong><strong><span style="FONT-SIZE: 14pt">malloc/free</span></strong><strong><span style="FONT-SIZE: 14pt">Z么还?/span></strong><strong><span style="FONT-SIZE: 14pt">new/delete</span></strong><strong><span style="FONT-SIZE: 14pt">Q?/span></strong><br /><br />  malloc与free是C++/C语言的标准库函数Qnew/delete是C++的运符。它们都可用于申请动态内存和释放内存?br /><br />  对于非内部数据类型的对象而言Q光用maloc/free无法满动态对象的要求。对象在创徏的同时要自动执行构造函敎ͼ对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运符Q不在编译器控制权限之内Q不能够把执行构造函数和析构函数的Q务强加于malloc/free?br /><br />  因此C++语言需要一个能完成动态内存分配和初始化工作的q算WnewQ以?qing)一个能完成清理与释攑ֆ存工作的q算Wdelete。注?new/delete不是库函数。我们先看一看malloc/free和new/delete如何实现对象的动态内存管理,见示??br /><br /><br /></div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e6e6e6; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>class Obj<br />{<br /> public :<br />  Obj(void){ cout << “Initialization?<< endl; }<br />  ~Obj(void){ cout << “Destroy?<< endl; }<br />  void Initialize(void){ cout << “Initialization?<< endl; }<br />  void Destroy(void){ cout << “Destroy?<< endl; }<br />};<br />void UseMallocFree(void)<br />{<br /> Obj *a = (obj *)malloc(sizeof(obj)); // 甌动态内?br /> a->Initialize(); // 初始?br /> //?br /> a->Destroy(); // 清除工作<br /> free(a); // 释放内存<br />}<br />void UseNewDelete(void)<br />{<br /> Obj *a = new Obj; // 甌动态内存ƈ且初始化<br /> //?br /> delete a; // 清除q且释放内存<br />}<br />     CZ6 用malloc/free和new/delete如何实现对象的动态内存管?br /><br /></div> </td> </tr> </tbody> </table> <div style="TEXT-INDENT: 21pt"> <br />  cObj的函数Initialize模拟?jin)构造函数的功能Q函数Destroy模拟?jin)析构函数的功能。函数UseMallocFree中,׃ malloc/free不能执行构造函C析构函数Q必调用成员函数Initialize和Destroy来完成初始化与清除工作。函?UseNewDelete则简单得多?br /><br />  所以我们不要企囄malloc/free来完成动态对象的内存理Q应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过E,对它们而言malloc/free和new/delete是等L(fng)?br /><br />  既然new/delete的功能完全覆盖了(jin)malloc/freeQؓ(f)什么C++不把malloc/free淘汰出局呢?q是因ؓ(f)C++E序l常要调用C函数Q而CE序只能用malloc/free理动态内存?/div> <div style="TEXT-INDENT: 21pt">如果用free释放“new创徏的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc甌的动态内存”,理论上讲E序不会(x)出错Q但是该E序的可L很差。所以new/delete必须配对使用Qmalloc/free也一栗?/div> <img src ="http://m.shnenglu.com/yishanhante/aggbug/18957.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/yishanhante/" target="_blank">jay</a> 2007-02-24 23:43 <a href="http://m.shnenglu.com/yishanhante/articles/18957.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++内存理详解Q一Q?/title><link>http://m.shnenglu.com/yishanhante/articles/18953.html</link><dc:creator>jay</dc:creator><author>jay</author><pubDate>Sat, 24 Feb 2007 14:06:00 GMT</pubDate><guid>http://m.shnenglu.com/yishanhante/articles/18953.html</guid><wfw:comment>http://m.shnenglu.com/yishanhante/comments/18953.html</wfw:comment><comments>http://m.shnenglu.com/yishanhante/articles/18953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/yishanhante/comments/commentRss/18953.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/yishanhante/services/trackbacks/18953.html</trackback:ping><description><![CDATA[ <div> <strong> <span style="FONT-SIZE: 14pt">1</span> </strong> <strong> <span style="FONT-SIZE: 14pt">、内存分配方?/span> </strong> </div> <div> <br />  内存分配方式有三U:(x)<br />  Q?Q从?rn)态存储区域分配。内存在E序~译的时候就已经分配好,q块内存在程序的整个q行期间都存在。例如全局变量Qstatic变量?br /><br />  Q?Q在栈上创徏。在执行函数Ӟ函数内局部变量的存储单元都可以在栈上创徏Q函数执行结束时q些存储单元自动被释放。栈内存分配q算内置于处理器的指令集中,效率很高Q但是分配的内存定w有限?br /><br />  Q?Q?从堆上分配,亦称动态内存分配。程序在q行的时候用malloc或new甌L多少的内存,E序员自p责在何时用free或delete释放内存。动态内存的生存期由我们军_Q用非常灵z,但问题(sh)最多?br /><br /><strong><span style="FONT-SIZE: 14pt">2</span></strong><strong><span style="FONT-SIZE: 14pt">、常见的内存错误?qing)其对?/span></strong></div> <div style="TEXT-INDENT: 21pt">发生内存错误是g非常ȝ(ch)的事情。编译器不能自动发现q些错误Q通常是在E序q行时才能捕捉到。而这些错误大多没有明昄症状Q时隐时玎ͼ增加?jin)改错的隑ֺ。有时用h气冲冲地把你找来,E序却没有发生Q何问题,你一赎ͼ错误又发作了(jin)?常见的内存错误及(qing)其对{如下:(x)<br /><br />  * 内存分配未成功,却用了(jin)它?br />  ~程新手常犯q种错误Q因Z们没有意识到内存分配?x)不成功。常用解军_法是Q在使用内存?sh)前(g)查指针是否ؓ(f)NULL。如果指针p是函数的参数Q那么在函数的入口处用assert(p!=NULL)q行<br /><br />  (g)查。如果是用malloc或new来申请内存,应该用if(p==NULL) 或if(p!=NULL)q行防错处理?br /><br />  * 内存分配虽然成功Q但是尚未初始化引用它?br /><br />  犯这U错误主要有两个起因Q一是没有初始化的观念;二是误以为内存的~省初值全为零Q导致引用初值错误(例如数组Q。内存的~省初值究竟是什么ƈ没有l一的标准,管有些时候ؓ(f)零|我们宁可信其无不可信其有。所以无论用何种方式创徏数组Q都别忘?sh)(jin)赋初|即便是赋零g不可省略Q不要嫌ȝ(ch)?br /><br />  * 内存分配成功q且已经初始化,但操作越q了(jin)内存的边界?br /><br />  例如在用数l时l常发生下标“多1”或者“少1”的操作。特别是在for循环语句中,循环ơ数很容易搞错,D数组操作界?br /><br />  * 忘记?jin)释攑ֆ存,造成内存泄露?br /><br />  含有q种错误的函数每被调用一ơ就丢失一块内存。刚开始时pȝ的内存充I你看不到错误。终有一ơ程序突然死掉,pȝ出现提示Q内存耗尽?br /><br />  动态内存的甌与释攑ֿ配对,E序中malloc与free的用次C定要相同Q否则肯定有错误Qnew/delete同理Q?br /><br />  * 释放?jin)内存却l箋(hu)使用它?br /> <br />  有三U情况:(x)<br /><br />  Q?Q程序中的对象调用关p过于复杂,实在难以搞清楚某个对象究竟是否已l释放了(jin)内存Q此时应该重新设计数据结构,从根本上解决对象理的؜乱局面?br /><br />  Q?Q函数的return语句写错?jin),注意不要q回指向“栈内存”的“指针”或者“引用”,因ؓ(f)该内存在函数体结束时被自动销毁?br /><br />  Q?Q用free或delete释放?jin)内存后Q没有将指针讄为NULL。导致生“野指针”?br /><br />  【规?】用malloc或new甌内存?sh)后Q应该立x(chng)查指针值是否ؓ(f)NULL。防止用指针gؓ(f)NULL的内存?br /><br />  【规?】不要忘Cؓ(f)数组和动态内存赋初倹{防止将未被初始化的内存?sh)?f)叛_g用?br /><br />  【规?】避免数l或指针的下标越界,特别要当?j)发生“多1”或者“少1”操作?br /><br />  【规?】动态内存的甌与释攑ֿ配对,防止内存泄漏?br /><br />  【规?】用free或delete释放?jin)内存?sh)后,立即指针设|ؓ(f)NULLQ防止生“野指针”?br /><br /><strong><span style="FONT-SIZE: 14pt">3</span></strong><strong><span style="FONT-SIZE: 14pt">、指针与数组的对?/span></strong><br /><br />  C++/CE序中,指针和数l在不少地方可以怺替换着用,让h产生一U错觉,以ؓ(f)两者是{h(hun)的?br /><br />  数组要么在静(rn)态存储区被创建(如全局数组Q,要么在栈上被创徏。数l名对应着Q而不是指向)(j)一块内存,其地址与容量在生命期内保持不变Q只有数l的内容可以改变?br /><br />  指针可以随时指向Lcd的内存块Q它的特征是“可变”,所以我们常用指针来操作动态内存。指针远比数l灵z,但也更危险?br /><br />  下面以字W串Z比较指针与数l的Ҏ(gu)?br /><br />  <strong>3.1 </strong><strong>修改内容</strong><br /><br />  CZ3-1中,字符数组a的容量是6个字W,其内容ؓ(f)hello。a的内容可以改变,如a[0]= ‘X’。指针p指向帔R字符东y(c)world”(位于?rn)态存储区Q内容ؓ(f)worldQ,帔R字符串的内容是不可以被修改的。从语法上看Q编译器q不觉得语句 p[0]= ‘X’有什么不妥,但是该语句企图修改常量字W串的内容而导致运行错误?/div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e0e0e0; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div>char a[] = “hello?<br />a[0] = ‘X?<br />cout << a << endl;<br />char *p = “world? // 注意p指向帔R字符?br />p[0] = ‘X? // ~译器不能发现该错误<br />cout << p << endl;<br />      CZ3.1 修改数组和指针的内容</div> </td> </tr> </tbody> </table> <div style="TEXT-INDENT: 21pt"> (tng)</div> <div style="TEXT-INDENT: 21pt">  <strong>3.2 </strong><strong>内容复制与比?/strong><br /><br />  不能Ҏ(gu)l名q行直接复制与比较。示?-3-2中,若想把数la的内容复制给数组bQ不能用语句 b = a Q否则将产生~译错误。应该用标准库函数strcpyq行复制。同理,比较b和a的内Ҏ(gu)否相同,不能用if(b==a) 来判断,应该用标准库函数strcmpq行比较?br /><br />  语句p = a q不能把a的内容复制指针pQ而是把a的地址赋给?jin)p。要惛_制a的内容,可以先用库函数malloc为p甌一块容量ؓ(f)strlen(a)+1个字W的内存Q再用strcpyq行字符串复制。同理,语句if(p==a) 比较的不是内容而是地址Q应该用库函数strcmp来比较?/div> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e0e0e0; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"> <div> <br />// 数组?br />char a[] = "hello";<br />char b[10];<br />strcpy(b, a); // 不能?b = a;<br />if(strcmp(b, a) == 0) // 不能?if (b == a)<br />?br />// 指针?br />int len = strlen(a);<br />char *p = (char *)malloc(sizeof(char)*(len+1));<br />strcpy(p,a); // 不要?p = a;<br />if(strcmp(p, a) == 0) // 不要?if (p == a)<br />?br />       CZ3.2 数组和指针的内容复制与比?/div> </td> </tr> </tbody> </table> <div style="TEXT-INDENT: 21pt"> (tng)</div> <div> <strong>3.3 </strong> <strong>计算内存定w</strong> <br /> <br />  用运符sizeof可以计算出数l的定wQ字节数Q?/div> <div>CZ7-3-3QaQ中Qsizeof(a)的值是12Q注意别忘(sh)(jin)’’)(j)。指针p指向aQ但?sizeof(p)的值却?。这是因为sizeof(p)得到的是一个指针变量的字节敎ͼ相当于sizeof(char*)Q而不是p所指的内存定w?C++/C语言没有办法知道指针所指的内存定wQ除非在甌内存时记住它? <div style="TEXT-INDENT: 21pt">注意当数l作为函数的参数q行传递时Q该数组自动退化ؓ(f)同类型的指针?/div><div style="TEXT-INDENT: 21pt">CZ7-3-3QbQ中Q不论数la的容量是多少Qsizeof(a)始终{于sizeof(char *)?br /><br /></div><table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e0e0e0; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"><tbody><tr><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"><div>char a[] = "hello world";<br />char *p = a;<br />cout<< sizeof(a) << endl; // 12字节<br />cout<< sizeof(p) << endl; // 4字节<br />     CZ3.3QaQ?计算数组和指针的内存定w</div></td></tr></tbody></table><div style="TEXT-INDENT: 21pt"> (tng)</div><table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e0e0e0; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"><tbody><tr><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568"><div>void Func(char a[100])<br />{<br /> cout<< sizeof(a) << endl; // 4字节而不?00字节<br />}<br />     CZ3.3QbQ?数组退化ؓ(f)指针</div><div> (tng)</div></td></tr></tbody></table></div> <img src ="http://m.shnenglu.com/yishanhante/aggbug/18953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/yishanhante/" target="_blank">jay</a> 2007-02-24 22:06 <a href="http://m.shnenglu.com/yishanhante/articles/18953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.gdhaojulai.cn" target="_blank">þùƷһ</a>| <a href="http://www.qingjian8.cn" target="_blank">ƷŮþþ</a>| <a href="http://www.sky1314.cn" target="_blank">þþƷһ</a>| <a href="http://www.fc117.cn" target="_blank">99þҹɫƷվ</a>| <a href="http://www.668j.cn" target="_blank">þ</a>| <a href="http://www.tfy8.cn" target="_blank">һõþۺϺݺݰ</a>| <a href="http://www.bkkg.net.cn" target="_blank">þҹ1000ϼ</a>| <a href="http://www.hotsw.com.cn" target="_blank">˾ƷۺϾþþþ</a>| <a href="http://www.rydtw.cn" target="_blank">һaƬþëƬ</a>| <a href="http://www.nsom.org.cn" target="_blank">Ʒþùһ㽶</a>| <a href="http://www.ttpcom.com.cn" target="_blank">þˬ˸߳AV</a>| <a href="http://www.bsgrhb.cn" target="_blank">ŷ޹Ʒþ</a>| <a href="http://www.tgl999.cn" target="_blank">޺ݺۺϾþ</a>| <a href="http://www.songyuan163.net.cn" target="_blank">þþþþϸApp</a>| <a href="http://www.ru87.cn" target="_blank">aaaƷþþùƬ</a>| <a href="http://www.dmbetter.cn" target="_blank">þþҹƷ</a>| <a href="http://www.digcm.cn" target="_blank">ԻԻ˿þþ</a>| <a href="http://www.fz-tm.cn" target="_blank">ۺպþóAV</a>| <a href="http://www.hqfood.com.cn" target="_blank">Ʒۺþþþþ</a>| <a href="http://www.uqknet.cn" target="_blank">ŷƷþþ </a>| <a href="http://www.muxi365.cn" target="_blank">þݺҹҹav˳ </a>| <a href="http://www.fragmentdesign.cn" target="_blank">ھƷþþþþþ97ţţ</a>| <a href="http://www.kucunshuo.cn" target="_blank">þùһ</a>| <a href="http://www.iido.org.cn" target="_blank">˳ŷþ</a>| <a href="http://www.icaew.com.cn" target="_blank">ھƷþþþӰԺվ</a>| <a href="http://www.woman365.cn" target="_blank">þþþavר</a>| <a href="http://www.wzwsbz.cn" target="_blank">þ97㽶</a>| <a href="http://www.e-ben.cn" target="_blank">þþþþžžƷӰԺ</a>| <a href="http://www.icrms.org.cn" target="_blank">þþþùƷ</a>| <a href="http://www.shssdq.cn" target="_blank">鶹Ʒþһ</a>| <a href="http://www.panxl.cn" target="_blank">޾ƷþþӰԺӰƬ</a>| <a href="http://www.nyeas.cn" target="_blank">þѴƬ</a>| <a href="http://www.liaoningluntan.cn" target="_blank">þ޹Ʒһ</a>| <a href="http://www.starlight-caraccessories.cn " target="_blank">ŷպþĻ</a>| <a href="http://www.265z.cn" target="_blank">͵͵þþþվ</a>| <a href="http://www.nzlx.cn" target="_blank">˳ɵӰվþ</a>| <a href="http://www.024cg.cn" target="_blank">һaɫƬþ</a>| <a href="http://www.daliandamingda.cn" target="_blank">þþþ޾Ʒþþþþþ </a>| <a href="http://www.b2bnn.cn" target="_blank">&#228;v뾫Ʒþþ</a>| <a href="http://www.6kun.cn" target="_blank">99þþƷëƬ</a>| <a href="http://www.zgyjj.cn" target="_blank">һaƬþëƬ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>