﻿<?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>IT博客-fyl-werewolf</title><link>http://www.cnitblog.com/fyl-werewolf/</link><description /><language>zh-cn</language><lastBuildDate>Mon, 04 May 2026 22:26:03 GMT</lastBuildDate><pubDate>Mon, 04 May 2026 22:26:03 GMT</pubDate><ttl>60</ttl><item><title>C/C++ 程序设计员应聘常见面试试题深入剖析 </title><link>http://www.cnitblog.com/fyl-werewolf/archive/2007/10/10/34649.html</link><dc:creator>redchief</dc:creator><author>redchief</author><pubDate>Wed, 10 Oct 2007 07:30:00 GMT</pubDate><guid>http://www.cnitblog.com/fyl-werewolf/archive/2007/10/10/34649.html</guid><wfw:comment>http://www.cnitblog.com/fyl-werewolf/comments/34649.html</wfw:comment><comments>http://www.cnitblog.com/fyl-werewolf/archive/2007/10/10/34649.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/fyl-werewolf/comments/commentRss/34649.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/fyl-werewolf/services/trackbacks/34649.html</trackback:ping><description><![CDATA[&nbsp;
<p><span>找错题</span><span><br><br></span><span>　　试题</span><span>1</span><span>：</span></p>
<div align=center>
<table cellPadding=0 width="90%" border=1>
    <tbody>
        <tr>
            <td>
            <p><span>void test1()<br>{<br></span><span>　</span><span>char string[10];<br></span><span>　</span><span>char* str1 = "0123456789";<br></span><span>　</span><span>strcpy( string, str1 );<br>}</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><span><br></span><span>　　试题</span><span>2</span><span>：</span></p>
<div align=center>
<table cellPadding=0 width="90%" border=1>
    <tbody>
        <tr>
            <td>
            <p><span>void test2()<br>{<br></span><span>　</span><span>char string[10], str1[10];<br></span><span>　</span><span>int i;<br></span><span>　</span><span>for(i=0; i&lt;10; i++)<br></span><span>　</span><span>{<br></span><span>　　</span><span>str1[i] = 'a';<br></span><span>　</span><span>}<br></span><span>　</span><span>strcpy( string, str1 );<br>}</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><span><br></span><span>　　试题</span><span>3</span><span>：</span></p>
<div align=center>
<table cellPadding=0 width="90%" border=1>
    <tbody>
        <tr>
            <td>
            <p><span>void test3(char* str1)<br>{<br></span><span>　</span><span>char string[10];<br></span><span>　</span><span>if( strlen( str1 ) &lt;= 10 )<br></span><span>　</span><span>{<br></span><span>　　</span><span>strcpy( string, str1 );<br></span><span>　</span><span>}<br>}</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><span><br></span><span>　　解答：</span></p>
<p>&nbsp;</p>
<p><span>我对这几道题目的分析如下：</span></p>
<p><span>1</span><span>、</span>&nbsp;<span>字符串和字符数组</span><span>char str1[]</span><span>的异同点：</span></p>
<p><span>通过实例说明：</span><span>string str=&#8221;<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="123456789" UnitName="&#8221;">0123456789&#8221;</st1:chmetcnv>; char str1[]={0,1,2,3,4,5,6,7,8,9}</span></p>
<p><span>（</span><span>1</span><span>）</span>&nbsp;<span>实际上字符串</span><span>str</span><span>也是由一个个的字符构成的，每一个字符都占据一个字节的空间，这一点和字符数组</span><span>str1</span><span>是一样的，但是字符串</span><span>str</span><span>后面会有一个追加的空字符</span><span>&#8217;\<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="0" UnitName="&#8217;">0&#8217;</st1:chmetcnv></span><span>来表示字符串的结尾，而字符数组是不用的。图示如下：</span></p>
<p><span>str</span><span>字符串</span></p>
<table cellSpacing=0 cellPadding=0 border=0>
    <tbody>
        <tr>
            <td vAlign=top width=30>
            <p><span>0</span></p>
            </td>
            <td vAlign=top width=30>
            <p><span>1</span></p>
            </td>
            <td vAlign=top width=30>
            <p><span>2</span></p>
            </td>
            <td vAlign=top width=30>
            <p><span>3</span></p>
            </td>
            <td vAlign=top width=30>
            <p><span>4</span></p>
            </td>
            <td vAlign=top width=30>
            <p><span>5</span></p>
            </td>
            <td vAlign=top width=30>
            <p><span>6</span></p>
            </td>
            <td vAlign=top width=30>
            <p><span>7</span></p>
            </td>
            <td vAlign=top width=30>
            <p><span>8</span></p>
            </td>
            <td vAlign=top width=30>
            <p><span>9</span></p>
            </td>
            <td vAlign=top width=30>
            <p><span>\0</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><span>str1</span><span>字符数组</span></p>
<table cellSpacing=0 cellPadding=0 border=0>
    <tbody>
        <tr>
            <td vAlign=top width=30>
            <p><span>0</span></p>
            </td>
            <td vAlign=top width=30>
            <p><span>1</span></p>
            </td>
            <td vAlign=top width=30>
            <p><span>2</span></p>
            </td>
            <td vAlign=top width=30>
            <p><span>3</span></p>
            </td>
            <td vAlign=top width=30>
            <p><span>4</span></p>
            </td>
            <td vAlign=top width=30>
            <p><span>5</span></p>
            </td>
            <td vAlign=top width=30>
            <p><span>6</span></p>
            </td>
            <td vAlign=top width=30>
            <p><span>7</span></p>
            </td>
            <td vAlign=top width=30>
            <p><span>8</span></p>
            </td>
            <td vAlign=top width=30>
            <p><span>9</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p><span>（</span><span>2</span><span>）</span>&nbsp;<span>但是我们在使用</span><span>strlen()</span><span>函数，获取字符串或字符数组长度时，都是</span><span>10</span><span>，因为在计算字符串长度时，并没有将字符串的最后一个空字符</span><span>&#8217;\<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="0" UnitName="&#8217;">0&#8217;</st1:chmetcnv></span><span>计算在内，这一点可以参照下面的</span><span>strlen()</span><span>函数的具体实现。</span></p>
<p><span>2</span><span>、</span>&nbsp;<span>关于字符串拷贝函数</span><span>strcpy()</span><span>：</span></p>
<p><span>这个函数需要两个字符指针</span><span>char*</span><span>参数，第一个参数表示目的字符串，第二个参数表示源字符串。但是需要注意的就是第二个字符指针必须指向一个字符串，而不能是一个字符数组，因为</span><span>strcpy()</span><span>函数具体实现里面有一个</span><span>for</span><span>循环，而这个</span><span>for</span><span>循环的结束条件就是碰到字符串中的空字符</span><span>&#8217;\<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="0" UnitName="&#8217;">0&#8217;</st1:chmetcnv></span><span>，如果第二个字符指针指向字符数组的话，将会导致</span><span>for</span><span>循环得不到正常结束，从而导致拷贝错误。</span><span>Strcpy()</span><span>函数也可参照下面的具体实现代码。</span></p>
<p><span>3</span><span>、</span>&nbsp;<span>字符串指针</span><span>char*</span><span>或称做字符指针的初始化问题（关键要习惯这种初始化格式）：</span></p>
<p><span>（</span><span>1</span><span>）</span>&nbsp;<span>将</span><span>char*</span><span>看作字符串指针，使用字符串初始化：</span></p>
<p><span>string str=&#8221;<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="12345" UnitName="&#8221;">12345&#8221;</st1:chmetcnv>;</span></p>
<p><span>char* ch=str;//</span><span>错误，不能将</span><span>str</span><span>型赋给</span><span>char*</span><span>，因为</span><span>str</span><span>是一个</span><span>string</span><span>类对象，类型不同不能赋值。</span></p>
<p><span>但是，下面的初始化就是正确的：</span></p>
<p><span>char ch="12345";//"12345"</span><span>根本就是一个字符串，也就是一个追加了空字符的字符数组而已，它的内存模型和</span><span>string</span><span>类对象根本就是<st1:chmetcnv w:st="on" TCSC="1" NumberType="3" Negative="False" HasSpace="False" SourceValue="2" UnitName="码">两码</st1:chmetcnv>事，这里初学者很容易搞混。</span></p>
<p><span>（</span><span>2</span><span>）</span>&nbsp;<span>将</span><span>char*</span><span>看作字符串指针，使用字符数组初始化：</span></p>
<p><span>char str[]={1,2,3,4,5};</span></p>
<p><span>char* ch=str;//</span><span>实际就是将字符数组中的第一个字符地址赋给</span><span>ch</span></p>
<p><span>上一语句相当于：</span><span>char* ch=&amp;str[0];</span></p>
<p><span>实际上，上面的字符数组</span><span>str</span><span>可以直接使用字符串初始化，这也是可以的，即：</span></p>
<p><span>char str[]="12345";</span></p>
<p><span>（</span><span>3</span><span>）</span>&nbsp;<span>将</span><span>char*</span><span>看作字符指针，使用某个字符的地址初始，但这种初始化方式的实际意义并不大：</span></p>
<p><span>char str=&#8217;A&#8217;;</span></p>
<p><span>char* ch=&amp;str;</span></p>
<p><span><br></span><span>　　试题</span><span>1</span><span>字符串</span><span>str1</span><span>需要</span><span>11</span><span>个字节才能存放下（包括末尾的</span><span>&#8217;\<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="0" UnitName="&#8217;">0&#8217;</st1:chmetcnv></span><span>），而</span><span>string</span><span>只有</span><span>10</span><span>个字节的空间，</span><span>strcpy</span><span>会导致数组越界；</span><span><br><br></span><span>　　对试题</span><span>2</span><span>，如果面试者指出字符数组</span><span>str1</span><span>不能在数组内结束可以给</span><span>3</span><span>分；如果面试者指出</span><span>strcpy(string, str1)</span><span>调用使得从</span><span>str1</span><span>内存起复制到</span><span>string</span><span>内存起所复制的字节数具有不确定性可以给</span><span>7</span><span>分，在此基础上指出库函数</span><span>strcpy</span><span>工作方式的给</span><span>10</span><span>分；</span><span><br><br></span><span>　　对试题</span><span>3</span><span>，</span><span>if(strlen(str1) &lt;= 10)</span><span>应改为</span><span>if(strlen(str1) &lt; 10)</span><span>，因为</span><span>strlen</span><span>的结果未统计</span><span>&#8217;\<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="0" UnitName="&#8217;">0&#8217;</st1:chmetcnv></span><span>所占用的</span><span>1</span><span>个字节。</span><span><br><br></span><span>　　剖析：</span><span><br><br></span><span>　　考查对基本功的掌握：</span><span><br><br></span><span>　　</span><span>(1)</span><span>字符串以</span><span>&#8217;\<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="0" UnitName="&#8217;">0&#8217;</st1:chmetcnv></span><span>结尾；</span><span><br><br></span><span>　　</span><span>(2)</span><span>对数组越界把握的敏感度；</span><span><br><br></span><span>　　</span><span>(3)</span><span>库函数</span><span>strcpy</span><span>的工作方式，如果编写一个标准</span><span>strcpy</span><span>函数的总分值为</span><span>10</span><span>，下面给出几个不同得分的答案：</span><span><br><br></span><span>　　</span><span>2</span><span>分</span></p>
<div align=center>
<table cellPadding=0 width="90%" border=1>
    <tbody>
        <tr>
            <td>
            <p><span>void strcpy( char *strDest, char *strSrc )<br>{<br></span><span>　</span><span> while( (*strDest++ = * strSrc++) != &#8216;\<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="0" UnitName="&#8217;">0&#8217;</st1:chmetcnv> );<br>}</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><span><br></span><span>　　</span><span>4</span><span>分</span></p>
<div align=center>
<table cellPadding=0 width="90%" border=1>
    <tbody>
        <tr>
            <td>
            <p><span>void strcpy( char *strDest, const char *strSrc ) <br>//</span><span>将源字符串加</span><span>const</span><span>，表明其为输入参数，加</span><span>2</span><span>分</span><span><br>{<br></span><span>　</span><span> while( (*strDest++ = * strSrc++) != &#8216;\<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="0" UnitName="&#8217;">0&#8217;</st1:chmetcnv> );<br>}</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><span><br></span><span>　　</span><span>7</span><span>分</span></p>
<div align=center>
<table cellPadding=0 width="90%" border=1>
    <tbody>
        <tr>
            <td>
            <p><span>void strcpy(char *strDest, const char *strSrc) <br>{<br></span><span>　</span><span>//</span><span>对源地址和目的地址加非</span><span>0</span><span>断言，加</span><span>3</span><span>分</span><span><br></span><span>　</span><span>assert( (strDest != NULL) &amp;&amp; (strSrc != NULL) );<br></span><span>　</span><span>while( (*strDest++ = * strSrc++) != &#8216;\<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="0" UnitName="&#8217;">0&#8217;</st1:chmetcnv> );<br>}</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><span><br></span><span>　　</span><span>10</span><span>分</span></p>
<div align=center>
<table cellPadding=0 width="90%" border=1>
    <tbody>
        <tr>
            <td>
            <p><span>//</span><span>为了实现链式操作，将目的地址返回，加</span><span>3</span><span>分！</span><span><br><br>char * strcpy( char *strDest, const char *strSrc ) <br>{<br></span><span>　</span><span>assert( (strDest != NULL) &amp;&amp; (strSrc != NULL) );<br></span><span>　</span><span>char *address = strDest; //</span><span>必须将目的字符串的目的地址保存，以防下面的</span><span>while</span><span>之后，无法返回目的字符串的地址，即第一个字符的地址</span><span><br></span><span>　</span><span>while( (*strDest++ = * strSrc++) != &#8216;\<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="0" UnitName="&#8217;">0&#8217;</st1:chmetcnv> ); <br></span><span>　　</span><span>return address;<br>}</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><span><br></span><span>　　从</span><span>2</span><span>分到</span><span>10</span><span>分的几个答案我们可以清楚的看到，小小的</span><span>strcpy</span><span>竟然暗藏着这么多玄机，真不是盖的！需要多么扎实的基本功才能写一个完美的</span><span>strcpy</span><span>啊！</span><span><br><br></span><span>　　</span><span>(4)</span><span>对</span><span>strlen</span><span>的掌握，它没有包括字符串末尾的</span><span>'\0'</span><span>。</span><span><br><br></span><span>　　读者看了不同分值的</span><span>strcpy</span><span>版本，应该也可以写出一个</span><span>10</span><span>分的</span><span>strlen</span><span>函数了，完美的版本为：</span><span> int strlen( const char *str ) //</span><span>输入参数</span><span>const</span></p>
<div align=center>
<table cellPadding=0 width="90%" border=1>
    <tbody>
        <tr>
            <td>
            <p><span>{<br></span><span>　</span><span>assert( strt != NULL ); //</span><span>断言字符串地址非</span><span>0<br></span><span>　</span><span>int len;<br></span><span>　</span><span>while( (*str++) != '\0' ) <br></span><span>　</span><span>{ <br></span><span>　　</span><span>len++; <br></span><span>　</span><span>} <br></span><span>　</span><span>return len;<br>}</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><span><br></span><span>　　试题</span><span>4</span><span>：</span></p>
<div align=center>
<table cellPadding=0 width="90%" border=1>
    <tbody>
        <tr>
            <td>
            <p><span>void GetMemory( char *p )<br>{<br></span><span>　</span><span>p = (char *) malloc( 100 );<br>}<br><br>void Test( void ) <br>{<br></span><span>　</span><span>char *str = NULL;<br></span><span>　</span><span>GetMemory( str ); <br></span><span>　</span><span>strcpy( str, "hello world" );<br></span><span>　</span><span>printf( str );<br>}</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><span><br></span><span>　　试题</span><span>5</span><span>：</span></p>
<div align=center>
<table cellPadding=0 width="90%" border=1>
    <tbody>
        <tr>
            <td>
            <p><span>char *GetMemory( void )<br>{ <br></span><span>　</span><span>char p[] = "hello world"; <br></span><span>　</span><span>return p; <br>}<br><br>void Test( void )<br>{ <br></span><span>　</span><span>char *str = NULL; <br></span><span>　</span><span>str = GetMemory(); <br></span><span>　</span><span>printf( str ); <br>}</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><span><br></span><span>　　试题</span><span>6</span><span>：</span></p>
<div align=center>
<table cellPadding=0 width="90%" border=1>
    <tbody>
        <tr>
            <td>
            <p><span>void GetMemory( char **p, int num )<br>{<br></span><span>　</span><span>*p = (char *) malloc( num );<br>}<br><br>void Test( void )<br>{<br></span><span>　</span><span>char *str = NULL;<br></span><span>　</span><span>GetMemory( &amp;str, 100 );<br></span><span>　</span><span>strcpy( str, "hello" ); <br></span><span>　</span><span>printf( str ); <br>}</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><span><br></span><span>　　试题</span><span>7</span><span>：</span></p>
<div align=center>
<table cellPadding=0 width="90%" border=1>
    <tbody>
        <tr>
            <td>
            <p><span>void Test( void )<br>{<br></span><span>　</span><span>char *str = (char *) malloc( 100 );<br></span><span>　</span><span>strcpy( str, "hello" );<br></span><span>　</span><span>free( str ); <br></span><span>　</span><span>... //</span><span>省略的其它语句</span><span><br>}</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><span><br></span><span>　　解答：</span><span><br><br></span><span>　　试题</span><span>4</span><span>传入中</span><span>GetMemory( char *p )</span><span>函数的形参为字符串指针，在函数内部修改形参并不能真正的改变传入形参的值，执行完</span></p>
<div align=center>
<table cellPadding=0 width="90%" border=1>
    <tbody>
        <tr>
            <td>
            <p><span>char *str = NULL;<br>GetMemory( str ); </span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><span><br></span><span>　　后的</span><span>str</span><span>仍然为</span><span>NULL</span><span>；</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>实际上，上面的参数传递是数值传递，不是地址传递，如果传入的指针地址是有效的，那么修改形参的指针值是不影响实参的，但如果修改形参指针指向的具体数据的话，那么实参指针指向的数据也就会改变的，因为形参和实参是地址相同的两个指针，他们指向同一个内存单元。</span><span><br><br></span><span>　　试题</span><span>5</span><span>中</span></p>
<div align=center>
<table cellPadding=0 width="90%" border=1>
    <tbody>
        <tr>
            <td>
            <p><span>char p[] = "hello world"; <br>return p; </span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><span><br></span><span>　　的</span><span>p[]</span><span>数组为函数内的局部自动变量，在函数返回后，内存已经被释放。这是许多程序员常犯的错误，其根源在于不理解变量的生存期。实际上，字符数组</span><span>p</span><span>存放在栈中的地址返回了，但是退出函数后，指针</span><span>p</span><span>指向的栈空间被释放，也就是说</span><span>p</span><span>指向的内存空间已经在退出函数时变成无效内存了。</span><span><br><br></span><span>　　试题</span><span>6: </span><span>该题稍微麻烦的地方是使用的指向指针型数据的指针：</span><span>char **p</span><span>这里我们就务必要清楚指针</span><span>p</span><span>的具体指向模型，否则无法做该题。</span></p>
<p>&nbsp;</p>
<p><span>GetMemory</span><span>避免了试题</span><span>4</span><span>的问题，传入</span><span>GetMemory</span><span>的参数为字符串指针的指针，但是在</span><span>GetMemory</span><span>中执行申请内存及赋值语句</span></p>
<div align=center>
<table cellPadding=0 width="90%" border=1>
    <tbody>
        <tr>
            <td>
            <p><span>*p = (char *) malloc( num );</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><span><br></span><span>　　后未判断内存是否申请成功，应加上：</span></p>
<div align=center>
<table cellPadding=0 width="90%" border=1>
    <tbody>
        <tr>
            <td>
            <p><span>if ( *p == NULL )<br>{<br></span><span>　</span><span>...//</span><span>进行申请内存失败处理</span><span><br>}</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><span><br></span><span>　　试题</span><span>7</span><span>存在与试题</span><span>6</span><span>同样的问题，在执行</span></p>
<div align=center>
<table cellPadding=0 width="90%" border=1>
    <tbody>
        <tr>
            <td>
            <p><span>char *str = (char *) malloc(100);</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><span><br></span><span>　　后未进行内存是否申请成功的判断；另外，在</span><span>free(str)</span><span>后未置</span><span>str</span><span>为空，导致可能变成一个</span><span>&#8220;</span><span>野</span><span>&#8221;</span><span>指针，应加上：</span></p>
<div align=center>
<table cellPadding=0 width="90%" border=1>
    <tbody>
        <tr>
            <td>
            <p><span>str = NULL;</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><span><br></span><span>　　试题</span><span>6</span><span>的</span><span>Test</span><span>函数中也未对</span><span>malloc</span><span>的内存进行释放。</span><span><br><br></span><span>　　剖析：</span><span><br><br></span><span>　　试题</span><span>4</span><span>～</span><span>7</span><span>考查面试者对内存操作的理解程度，基本功扎实的面试者一般都能正确的回答其中</span><span>50~60</span><span>的错误。但是要完全解答正确，却也绝非易事。</span><span><br><br></span><span>　　对内存操作的考查主要集中在：</span><span><br><br></span><span>　　（</span><span>1</span><span>）指针的理解；</span><span><br><br></span><span>　　（</span><span>2</span><span>）变量的生存期及作用范围；</span><span><br><br></span><span>　　（</span><span>3</span><span>）良好的动态内存申请和释放习惯。</span><span><br><br></span><span>　　再看看下面的一段程序有什么错误：</span></p>
<div align=center>
<table cellPadding=0 width="90%" border=1>
    <tbody>
        <tr>
            <td>
            <p><span>swap( int* p1,int* p2 )<br>{<br></span><span>　</span><span>int *p;<br></span><span>　</span><span>*p = *p1;<br></span><span>　</span><span>*p1 = *p2;<br></span><span>　</span><span>*p2 = *p;<br>}</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><span><br></span><span>　　在</span><span>swap</span><span>函数中，</span><span>p</span><span>是一个</span><span>&#8220;</span><span>野</span><span>&#8221;</span><span>指针，有可能指向系统区，导致程序运行的崩溃。在</span><span>VC++</span><span>中</span><span>DEBUG</span><span>运行时提示错误</span><span>&#8220;Access Violation&#8221;</span><span>。该程序应该改为：</span></p>
<div align=center>
<table cellPadding=0 width="90%" border=1>
    <tbody>
        <tr>
            <td>
            <p><span>swap( int* p1,int* p2 )<br>{<br></span><span>　</span><span>int p;<br></span><span>　</span><span>p = *p1;<br></span><span>　</span><span>*p1 = *p2;<br></span><span>　</span><span>*p2 = p;<br>}</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p>&nbsp;</p>
<p><span>补充：关于字符、字符串、字符数组的打印输出问题：</span></p>
<p><span>char ch1='a';</span></p>
<p><span>char* ch2="12345";</span></p>
<p><span>char&nbsp; ch3[]="67890";</span></p>
<p><span>cout&lt;&lt;ch1&lt;&lt;endl;//</span><span>输出</span><span>a</span></p>
<p><span>cout&lt;&lt;ch2&lt;&lt;endl;//</span><span>输出</span><span>12345</span></p>
<p><span>cout&lt;&lt;ch3&lt;&lt;endl;//</span><span>输出</span><span>67890</span></p>
<p><span>cout&lt;&lt;*ch2&lt;&lt;endl;//</span><span>输出</span><span>1</span></p>
<p><span>cout&lt;&lt;*ch3&lt;&lt;endl;//</span><span>输出</span><span>6</span></p>
<p><span>cout&lt;&lt;&amp;ch1&lt;&lt;endl;//</span><span>输出</span><span>a</span><span>，然后是乱码</span></p>
<p><span>需要注意的就是当</span><span>cout</span><span>指针时，也是碰到字符串的终止符</span><span>'\0'</span><span>后就停止输出，而字节数组也有长度可以判断，所以输出信息正常。当输出具体指针指向的字符时，就仅仅输出一个字符而已了。但是当输出</span><span>&amp;ch1</span><span>时，由于得不到终止符号就不停输出，所以才会出现乱码。</span></p>
<p>&nbsp;</p>
<img src ="http://www.cnitblog.com/fyl-werewolf/aggbug/34649.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/fyl-werewolf/" target="_blank">redchief</a> 2007-10-10 15:30 <a href="http://www.cnitblog.com/fyl-werewolf/archive/2007/10/10/34649.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>