﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-role0523</title><link>http://www.cppblog.com/role0523/</link><description /><language>zh-cn</language><lastBuildDate>Sat, 11 Apr 2026 17:23:52 GMT</lastBuildDate><pubDate>Sat, 11 Apr 2026 17:23:52 GMT</pubDate><ttl>60</ttl><item><title>数组越界的陷阱</title><link>http://www.cppblog.com/role0523/archive/2010/07/18/120656.html</link><dc:creator>role0523</dc:creator><author>role0523</author><pubDate>Sat, 17 Jul 2010 17:31:00 GMT</pubDate><guid>http://www.cppblog.com/role0523/archive/2010/07/18/120656.html</guid><wfw:comment>http://www.cppblog.com/role0523/comments/120656.html</wfw:comment><comments>http://www.cppblog.com/role0523/archive/2010/07/18/120656.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/role0523/comments/commentRss/120656.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/role0523/services/trackbacks/120656.html</trackback:ping><description><![CDATA[&nbsp; 以前在项目中，发现了一个由于数组越界访问的BUG。数组越界访问的结果是未定义的，在大多数情况下，会出现空指针异常。
<p>&nbsp;&nbsp;&nbsp; 但是如果在结构体中，两个数组的内存分配是连续的。为了示例方便，我将代码做了简化，例如如下面的test结果体中，数组a和数组b的内存是连续的，也就是说a[9]后面跟的就是b[0].</p>
<p>&nbsp;&nbsp;&nbsp; 因此在访问a的时候，如果数组越界，就会访问到数组b中，例如a[29]=b[19]; 因此如果不对a的数组访问进行下标校验，将会从b中取得数据，如果在对a赋值时越界，将会对b中的数据进行修改，这将会带来调试的巨大麻烦，表现形式是b数据在某个地方被修改了。<br><br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;test<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img id=Codehighlighter1_12_44_Open_Image onclick="this.style.display='none'; Codehighlighter1_12_44_Open_Text.style.display='none'; Codehighlighter1_12_44_Closed_Image.style.display='inline'; Codehighlighter1_12_44_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_12_44_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_12_44_Closed_Text.style.display='none'; Codehighlighter1_12_44_Open_Image.style.display='inline'; Codehighlighter1_12_44_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_12_44_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_12_44_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a[</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">];<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;b[</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">];<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img id=Codehighlighter1_58_228_Open_Image onclick="this.style.display='none'; Codehighlighter1_58_228_Open_Text.style.display='none'; Codehighlighter1_58_228_Closed_Image.style.display='inline'; Codehighlighter1_58_228_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_58_228_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_58_228_Closed_Text.style.display='none'; Codehighlighter1_58_228_Open_Image.style.display='inline'; Codehighlighter1_58_228_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_58_228_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_58_228_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;test&nbsp;t;<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;result;<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img id=Codehighlighter1_125_151_Open_Image onclick="this.style.display='none'; Codehighlighter1_125_151_Open_Text.style.display='none'; Codehighlighter1_125_151_Closed_Image.style.display='inline'; Codehighlighter1_125_151_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_125_151_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_125_151_Closed_Text.style.display='none'; Codehighlighter1_125_151_Open_Image.style.display='inline'; Codehighlighter1_125_151_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_125_151_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_125_151_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.b[i]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">i</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;result</span><span style="COLOR: #000000">=*</span><span style="COLOR: #000000">(t.a</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">29</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">the&nbsp;result&nbsp;is&nbsp;%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,result);<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
因此，切记在访问或者操作数组时，一定要对数组下标进行校验，例如上面的例子可以修改为:<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(index</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">index</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img id=Codehighlighter1_24_52_Open_Image onclick="this.style.display='none'; Codehighlighter1_24_52_Open_Text.style.display='none'; Codehighlighter1_24_52_Closed_Image.style.display='inline'; Codehighlighter1_24_52_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_24_52_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_24_52_Closed_Text.style.display='none'; Codehighlighter1_24_52_Open_Image.style.display='inline'; Codehighlighter1_24_52_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_24_52_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_24_52_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;result</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">a[index]);&nbsp;<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<img src ="http://www.cppblog.com/role0523/aggbug/120656.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/role0523/" target="_blank">role0523</a> 2010-07-18 01:31 <a href="http://www.cppblog.com/role0523/archive/2010/07/18/120656.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>i++与++i</title><link>http://www.cppblog.com/role0523/archive/2010/07/18/120655.html</link><dc:creator>role0523</dc:creator><author>role0523</author><pubDate>Sat, 17 Jul 2010 17:29:00 GMT</pubDate><guid>http://www.cppblog.com/role0523/archive/2010/07/18/120655.html</guid><wfw:comment>http://www.cppblog.com/role0523/comments/120655.html</wfw:comment><comments>http://www.cppblog.com/role0523/archive/2010/07/18/120655.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/role0523/comments/commentRss/120655.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/role0523/services/trackbacks/120655.html</trackback:ping><description><![CDATA[编译环境gcc4.4.1<br>如下代码<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;(a</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,a);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">a)&nbsp;;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,a);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">a)&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;a;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,a);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;(a</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;a;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">a++不能作为左值参加运算。</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,a);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">a)&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;(a</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,a);</span></div>
打印的值为9，10，10，11。汇编代码如下：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#&nbsp;a&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;(a</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">00401326</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;movl&nbsp;&nbsp;&nbsp;$</span><span style="COLOR: #000000">0x4</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0x1c</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>0040132E&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x1c</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp),</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">00401332</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax,</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">00401334</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax,</span><span style="COLOR: #000000">0x1c</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">00401338</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;incl&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x1c</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>0040133C&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x1c</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp),</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">00401340</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax,</span><span style="COLOR: #000000">0x4</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">00401344</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;movl&nbsp;&nbsp;&nbsp;$</span><span style="COLOR: #000000">0x46f024</span><span style="COLOR: #000000">,(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>0040134B&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x41c750</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">printf</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#&nbsp;&nbsp;a&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">a)&nbsp;;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">00401350</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;movl&nbsp;&nbsp;&nbsp;$</span><span style="COLOR: #000000">0x4</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0x1c</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">00401358</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;incl&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x1c</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>0040135C&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x1c</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp),</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">00401360</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax,</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">00401362</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax,</span><span style="COLOR: #000000">0x1c</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">00401366</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x1c</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp),</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>0040136A&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax,</span><span style="COLOR: #000000">0x4</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>0040136E&nbsp;&nbsp;&nbsp;&nbsp;movl&nbsp;&nbsp;&nbsp;$</span><span style="COLOR: #000000">0x46f024</span><span style="COLOR: #000000">,(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">00401375</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x41c750</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">printf</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#&nbsp;&nbsp;(</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">a)&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;a;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>0040137A&nbsp;&nbsp;&nbsp;&nbsp;movl&nbsp;&nbsp;&nbsp;$</span><span style="COLOR: #000000">0x4</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0x1c</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">00401382</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;incl&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x1c</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">00401386</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x1c</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp),</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>0040138A&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax,</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>0040138C&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax,</span><span style="COLOR: #000000">0x1c</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">00401390</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x1c</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp),</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">00401394</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax,</span><span style="COLOR: #000000">0x4</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">00401398</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;movl&nbsp;&nbsp;&nbsp;$</span><span style="COLOR: #000000">0x46f024</span><span style="COLOR: #000000">,(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>0040139F&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x41c750</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">printf</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#(</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">a)&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;(a</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>004013A4&nbsp;&nbsp;&nbsp;&nbsp;movl&nbsp;&nbsp;&nbsp;$</span><span style="COLOR: #000000">0x4</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0x1c</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>004013AC&nbsp;&nbsp;&nbsp;&nbsp;incl&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x1c</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>004013B0&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x1c</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp),</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>004013B4&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax,</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>004013B6&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax,</span><span style="COLOR: #000000">0x1c</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>004013BA&nbsp;&nbsp;&nbsp;&nbsp;incl&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x1c</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>004013BE&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x1c</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp),</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>004013C2&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax,</span><span style="COLOR: #000000">0x4</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>004013C6&nbsp;&nbsp;&nbsp;&nbsp;movl&nbsp;&nbsp;&nbsp;$</span><span style="COLOR: #000000">0x46f024</span><span style="COLOR: #000000">,(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>004013CD&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x41c750</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">printf</span><span style="COLOR: #000000">&gt;</span></div>
<br>可以看出，在运算过程中，++a优先级&gt; +=&nbsp; &gt; a++<br>1)先运算a+a,然后再自增a<br>2),3)先运算++a,然后再a+a<br>4)先运算++a,然后a+a,然后a++ 
<img src ="http://www.cppblog.com/role0523/aggbug/120655.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/role0523/" target="_blank">role0523</a> 2010-07-18 01:29 <a href="http://www.cppblog.com/role0523/archive/2010/07/18/120655.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>空数组的内存地址</title><link>http://www.cppblog.com/role0523/archive/2010/07/18/120654.html</link><dc:creator>role0523</dc:creator><author>role0523</author><pubDate>Sat, 17 Jul 2010 17:12:00 GMT</pubDate><guid>http://www.cppblog.com/role0523/archive/2010/07/18/120654.html</guid><wfw:comment>http://www.cppblog.com/role0523/comments/120654.html</wfw:comment><comments>http://www.cppblog.com/role0523/archive/2010/07/18/120654.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/role0523/comments/commentRss/120654.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/role0523/services/trackbacks/120654.html</trackback:ping><description><![CDATA[<p>定义如下一个struct<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;T<br>{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;b[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">];<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c;<br>};</span></div>
打印各个成员的地址和大小，结果如下：<br>编译环境Code::Blocks 10.05<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;T&nbsp;t;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%p:%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">(t.a),</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(t.a));<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%p:%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">(t.b),</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(t.b));<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%p:%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">(t.c),</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(t.c));</span></div>
<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">0022FF38:</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000"><br>0022FF3C:</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"><br>0022FF3C:</span><span style="COLOR: #000000">4</span></div>
可见定义的空数组，是不占任何空间的。其返回的内存地址是下一个可分配的地址。
<img src ="http://www.cppblog.com/role0523/aggbug/120654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/role0523/" target="_blank">role0523</a> 2010-07-18 01:12 <a href="http://www.cppblog.com/role0523/archive/2010/07/18/120654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个没有返回值的函数</title><link>http://www.cppblog.com/role0523/archive/2010/07/18/120653.html</link><dc:creator>role0523</dc:creator><author>role0523</author><pubDate>Sat, 17 Jul 2010 17:06:00 GMT</pubDate><guid>http://www.cppblog.com/role0523/archive/2010/07/18/120653.html</guid><wfw:comment>http://www.cppblog.com/role0523/comments/120653.html</wfw:comment><comments>http://www.cppblog.com/role0523/archive/2010/07/18/120653.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/role0523/comments/commentRss/120653.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/role0523/services/trackbacks/120653.html</trackback:ping><description><![CDATA[<p>如果在返回值为int的函数里，漏掉return，会发生什么情况？<br><br>编译工具：Code::Blocks 10.05,代码如下所示</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">cstdio</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;f()&nbsp;<br>{<br>}<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main&nbsp;()<br>{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,f());<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,f());<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,f());<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div>
编译时，提示<br>In function 'int f()':|<br>warning: no return statement in function returning non-void|<br>但是能编译<br><br>Debug版本下结果如下：<br>1 2 2<br>Release版本下结果<br>0 0 0<br><br>下面分析一下为什么为发生这种情况：<br><br>从code:: blocks里面看到的 函数f的汇编代码<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">00401318</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">ebp<br></span><span style="COLOR: #000000">00401319</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp,</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">ebp&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">正确的似乎是&nbsp;mov&nbsp;%ebp&nbsp;%esp</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">0040131B&nbsp;&nbsp;&nbsp;&nbsp;leave<br>0040131C&nbsp;&nbsp;&nbsp;&nbsp;ret<br></span></div>
如果函数f()如下定义<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;f()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">;<br>}</span></div>
则汇编代码是<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">00401318</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">ebp<br></span><span style="COLOR: #000000">00401319</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp,</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">ebp<br>0040131B&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;$</span><span style="COLOR: #000000">0x64</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax<br></span><span style="COLOR: #000000">00401320</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;leave<br></span><span style="COLOR: #000000">00401321</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ret<br></span></div>
接下来我们看一下整个main函数的汇编代码<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">00401322</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">ebp<br></span><span style="COLOR: #000000">00401323</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp,</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">ebp<br></span><span style="COLOR: #000000">00401325</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;&nbsp;&nbsp;$</span><span style="COLOR: #000000">0xfffffff0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp<br></span><span style="COLOR: #000000">00401328</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;$</span><span style="COLOR: #000000">0x10</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp<br>0040132B&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x401770</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">__main</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">00401330</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x401318</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">f()</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">00401335</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax,</span><span style="COLOR: #000000">0x4</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br></span><span style="COLOR: #000000">00401339</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;movl&nbsp;&nbsp;&nbsp;$</span><span style="COLOR: #000000">0x403024</span><span style="COLOR: #000000">,(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br></span><span style="COLOR: #000000">00401340</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x4019ac</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">printf</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">00401345</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x401318</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">f()</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>0040134A&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax,</span><span style="COLOR: #000000">0x4</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">将返回值传递给%esp+0x04</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">0040134E&nbsp;&nbsp;&nbsp;&nbsp;movl&nbsp;&nbsp;&nbsp;$</span><span style="COLOR: #000000">0x403024</span><span style="COLOR: #000000">,(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br></span><span style="COLOR: #000000">00401355</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x4019ac</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">printf</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>0040135A&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x401318</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">f()</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>0040135F&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax,</span><span style="COLOR: #000000">0x4</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br></span><span style="COLOR: #000000">00401363</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;movl&nbsp;&nbsp;&nbsp;$</span><span style="COLOR: #000000">0x403024</span><span style="COLOR: #000000">,(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br>0040136A&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x4019ac</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">printf</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>0040136F&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;$</span><span style="COLOR: #000000">0x0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax<br></span><span style="COLOR: #000000">00401374</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;leave<br></span><span style="COLOR: #000000">00401375</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ret</span></div>
<br><br>从中我们可以看出，函数f（）是将返回值通过EAX寄存器中，传递给调用它的代码。<br>如过我们漏掉了return intVal语句，在Debug模式下可能会导致，调用f()的代码得到的是上次的其他函数被调用的返回值。<br>在进入main之后EAX通常会被初始化为0x01.所以第一个f() 返回值为1.<br>printf 打印了&#8220;1 &#8221;两个字符之后，返回值为2，所以第二个f()返回值为2。<br>printf 打印了&#8220;2 &#8221;两个字符之后，返回值为2，所以第三个f()返回值为2。<br><br><br>在Release版本下，函数f()被优化，printf直接打印数字0。<br>&nbsp;
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #000000">401320</span><span style="COLOR: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">ebp<br>&nbsp;&nbsp;</span><span style="COLOR: #000000">401321</span><span style="COLOR: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp,</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">ebp<br>&nbsp;&nbsp;</span><span style="COLOR: #000000">401323</span><span style="COLOR: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;&nbsp;&nbsp;$</span><span style="COLOR: #000000">0xfffffff0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp<br>&nbsp;&nbsp;</span><span style="COLOR: #000000">401326</span><span style="COLOR: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;$</span><span style="COLOR: #000000">0x10</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp<br>&nbsp;&nbsp;</span><span style="COLOR: #000000">401329</span><span style="COLOR: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x401760</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;40132e:&nbsp;&nbsp;&nbsp;&nbsp;movl&nbsp;&nbsp;&nbsp;$</span><span style="COLOR: #000000">0x0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0x4</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br>&nbsp;&nbsp;</span><span style="COLOR: #000000">401335</span><span style="COLOR: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;</span><span style="COLOR: #000000">401336</span><span style="COLOR: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;movl&nbsp;&nbsp;&nbsp;$</span><span style="COLOR: #000000">0x403024</span><span style="COLOR: #000000">,(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br>&nbsp;&nbsp;40133d:&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x40199c</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;</span><span style="COLOR: #000000">401342</span><span style="COLOR: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;movl&nbsp;&nbsp;&nbsp;$</span><span style="COLOR: #000000">0x0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0x4</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br>&nbsp;&nbsp;</span><span style="COLOR: #000000">401349</span><span style="COLOR: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;40134a:&nbsp;&nbsp;&nbsp;&nbsp;movl&nbsp;&nbsp;&nbsp;$</span><span style="COLOR: #000000">0x403024</span><span style="COLOR: #000000">,(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br>&nbsp;&nbsp;</span><span style="COLOR: #000000">401351</span><span style="COLOR: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x40199c</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;</span><span style="COLOR: #000000">401356</span><span style="COLOR: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;movl&nbsp;&nbsp;&nbsp;$</span><span style="COLOR: #000000">0x0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0x4</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br>&nbsp;&nbsp;40135d:&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;40135e:&nbsp;&nbsp;&nbsp;&nbsp;movl&nbsp;&nbsp;&nbsp;$</span><span style="COLOR: #000000">0x403024</span><span style="COLOR: #000000">,(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">esp)<br>&nbsp;&nbsp;</span><span style="COLOR: #000000">401365</span><span style="COLOR: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0x40199c</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;40136a:&nbsp;&nbsp;&nbsp;&nbsp;xor&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax,</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">eax<br>&nbsp;&nbsp;40136c:&nbsp;&nbsp;&nbsp;&nbsp;leave&nbsp;&nbsp;<br>&nbsp;&nbsp;40136d:&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div>
<img src ="http://www.cppblog.com/role0523/aggbug/120653.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/role0523/" target="_blank">role0523</a> 2010-07-18 01:06 <a href="http://www.cppblog.com/role0523/archive/2010/07/18/120653.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>