<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[memmove() -- 拷贝内存内容]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Tue, 09 Nov 2010 15:24:14 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	相关函数: bcopy(), memccpy(), memcpy(), strcpy(), strncpy()<br/>表头文件: #include &lt;string.h&gt;<br/>定义函数: void *memmove(void *dest, const void *src, size_t n);<br/>函数说明: memmove()与memcpy()一样都是用来拷贝src所指的内存内容前n个字节到dest所指的地址上。不同的是,当src和dest所指的内存区域重叠时,memmove()仍然可以正确的处理,不过执行效率上会比使用memcpy()略慢些。<br/>返回值: 返回指向dest的指针。<br/>附加说明: 指针src和dest所指的内存区域可以重叠。<br/><br/><br/><br/>memcpy()、 memmove()和memccpy()<br/>-------------------------------------------------------<br/>&nbsp;&nbsp;&nbsp;&nbsp;这三个函数的功能均是将某个内存块复制到另一个内存块。前两个函数的区别在于它们处理内存区域重叠(overlapping)的方式不同。第三三个函数的功能也是复制内存，但是如果遇到某个特定值时立即停止复制。<br/>&nbsp;&nbsp;&nbsp;&nbsp;对于库函数来说，由于没有办法知道传递给他的内存区域的情况，所以应该使用memmove()函数。通过这个函数，可以保证不会出现任何内存块重叠问题。而对于应用程序来说，因为代码“知道”两个内存块不会重叠，所以可以安全地使用memcpy()函数。<br/><br/><br/><br/>-------------------------------------------------------<br/>#include &lt;string.h&gt;<br/>#include &lt;stdio.h&gt;<br/><br/>int main()<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;char s[] = &quot;zengxiaolong&quot;;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;memmove(s, s+4, strlen(s)-4);<br/>&nbsp;&nbsp;&nbsp;&nbsp;s[strlen(s)-4] = &#039;&#92;0&#039;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;*s = %s&#92;n&quot;, s);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br/>&#125;<br/> <br/><br/>运行显示：*s = xiaolong<br/>如果注释掉： s[strlen(s)-4] = &#039;&#92;0&#039;;<br/>运行显示：*s = xiaolonglong<br/>其实就是：zengxiaolong的指针被这个函数从往后4个后的xiaolong给拷贝到移动到zengxiao，xiaolong==》xiaolonglong，而<br/>这个s[strlen(s)-4] = &#039;&#92;0&#039;;就是截断...<br/><br/><br/>memcpy用法：<br/><div class="code"><br/>#include &lt;iostream&gt;<br/>#include &lt;string.h&gt;<br/>using namespace std;<br/>int main()<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;char a&#91;&#93; = &quot;xiang dong yang&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;char *b;<br/>&nbsp;&nbsp;&nbsp;&nbsp;char c&#91;&#93;=&quot;xiang dong yang hello the world&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;b=c;<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%s&#92;n&quot;,c);<br/>&nbsp;&nbsp;&nbsp;&nbsp;memcpy(b,a+6,strlen(a)-6);<br/>&nbsp;&nbsp;&nbsp;&nbsp;//a&#91;strlen(b)-6&#93;=&#039;&#92;0&#039;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;*(b+9)=&#039;&#92;0&#039;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%s&quot;,c);<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;------------&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%d&quot;,strlen(c));<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%c&quot;,c&#91;10&#93;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%c&quot;,c&#91;11&#93;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%c&quot;,c&#91;12&#93;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;============&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%s&quot;,c);<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;============&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%c&quot;,*(c+10));//越过&#92;0的截断区域打印一个字符<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%c&quot;,*(c+11));<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%c&quot;,*(c+12));<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#92;n&quot;);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%s&quot;,c+12);//打印&#92;0截断后的后面字符<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#92;n&quot;);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;------------&#92;n&quot;);<br/><br/><br/>&#125;<br/><br/></div><br/>特别注意：printf %c,%s 区别，如下：<br/><div class="code">printf(&quot;%s&quot;,pointer p);//指针地址<br/>printf(&quot;%c&quot;,pointer *p);//指针指向的值</div>
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] memmove() -- 拷贝内存内容]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>