﻿<?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++博客-淡、静</title><link>http://www.cppblog.com/kang/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 23 Apr 2026 10:12:54 GMT</lastBuildDate><pubDate>Thu, 23 Apr 2026 10:12:54 GMT</pubDate><ttl>60</ttl><item><title>memmove、memcpy和memccpy简介</title><link>http://www.cppblog.com/kang/archive/2009/04/05/78984.html</link><dc:creator>kang</dc:creator><author>kang</author><pubDate>Sat, 04 Apr 2009 16:43:00 GMT</pubDate><guid>http://www.cppblog.com/kang/archive/2009/04/05/78984.html</guid><wfw:comment>http://www.cppblog.com/kang/comments/78984.html</wfw:comment><comments>http://www.cppblog.com/kang/archive/2009/04/05/78984.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/kang/comments/commentRss/78984.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kang/services/trackbacks/78984.html</trackback:ping><description><![CDATA[<p><span style="FONT-FAMILY: Comic Sans MS">memmove、memcpy和memccpy三个函数都是内存的拷贝，从一个缓冲区拷贝到另一个缓冲区。<br>memmove(void *dest,void*src,int count)<br>memcpy(void *dest,void *src,int count)<br>memccpy(void*dest,void*src,int ch,int count)<br><br>表头文件: #include &lt;string.h&gt;<br>定义函数: void *memcpy(void *dest, const void *src, size_t n)<br>函数说明: memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束'\0'而结束<br>返回值:&nbsp;&nbsp; 返回指向dest的指针<br><br>表头文件: #include &lt;string.h&gt;<br>定义函数: void *memccpy(void *dest, const void *src, int c, size_t n);<br>函数说明: memccpy()用来拷贝src所指的内存内容前n个字节到dest所指的地址上。与memcpy()不同的是,memccpy()如果在src中遇到某个特定值(int c)立即停止复制。<br>返回值:&nbsp;&nbsp; 返回指向dest中值为c的下一个字节指针。返回值为0表示在src所指内存前n个字节中没有值为c的字节。<br></span><br><font face="Comic Sans MS">表头文件: #include &lt;string.h&gt;<br>定义函数: void *memmove(void *dest, const void *src, size_t n);<br>函数说明:memmove()是从一个缓冲区移动到另一个缓冲区中。&nbsp;<br>返回值:&nbsp;&nbsp; 返回指向dest指针。<br><br>当dest &lt;= src-count 或dest &gt;= src+count时，以上三个函数均不会产生覆盖问题，即源数据不会被更改。<br></font>若不在以上范围内，则源数据会被更改。<br><br>如:<br>char a[]={'a','b'};<br>char b[]={'c','d','e','f','g','h'};<br>memmove(a,b,sizeof(b));<br>或是直接char *p=b+2;memmove(p,b,sizeof(b));<br>输出数据会发现b中数据输出已被更改。<br>发现即使a数组指向的空间不够存储数据，也能够移动成功。<br>原因|dest - src |&lt;count<br><br>如果在使用这些函数时，分配给足够的空间，然后再使用就不会出现覆盖问题。也就是说如果外部分配给的空间不足以存储要拷贝的数据时，就有可能出现源数据被覆盖更改的问题。<br><br>#include &lt;stdio.h&gt;<br>#include &lt;stdlib.h&gt;<br>#include &lt;string.h&gt;<br><br>void main(void)<br>{<br>&nbsp;int i=0; <br>&nbsp;&nbsp;&nbsp; char a[9]={'a','b','c','d','e','f','g','h','\0'};<br>&nbsp;char p[2]={'q','w'};//或char *p=a+2;<br>&nbsp;memmove(p,a,sizeof(a));<br>&nbsp;&nbsp;&nbsp; puts(a);<br>&nbsp;printf("_____________________________________________\n");<br>&nbsp;puts(p);<br>&nbsp;printf("_____________________________________________\n");<br>&nbsp;&nbsp;for(i =0;i&lt;10;i++)<br>&nbsp;&nbsp;&nbsp;printf("%c %d \n",*(a+i),a+i);<br>&nbsp;printf("_____________________________________________\n");<br>&nbsp;for(i =0;i&lt;8;i++)<br>&nbsp;&nbsp;&nbsp;printf("%c %d \n",*(p+i),p+i);&nbsp;<br>}<br>观察输出结果。<br>把memmove(p,a,sizeof(a));改为memcpy(p,a,sizeof(a));或memccpy(p,a,'e',sizeof(a));再观察输出结果。<br>可以看出在目的存储空间不足时，便会出现源数据被覆盖改变的问题。<br>如果目的存储空间分配足够的空间，则便不会出现覆盖问题。<br><br><br><br><br></p>
<img src ="http://www.cppblog.com/kang/aggbug/78984.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kang/" target="_blank">kang</a> 2009-04-05 00:43 <a href="http://www.cppblog.com/kang/archive/2009/04/05/78984.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++中重载、覆盖和隐藏的区别</title><link>http://www.cppblog.com/kang/archive/2009/03/21/77409.html</link><dc:creator>kang</dc:creator><author>kang</author><pubDate>Sat, 21 Mar 2009 07:43:00 GMT</pubDate><guid>http://www.cppblog.com/kang/archive/2009/03/21/77409.html</guid><wfw:comment>http://www.cppblog.com/kang/comments/77409.html</wfw:comment><comments>http://www.cppblog.com/kang/archive/2009/03/21/77409.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kang/comments/commentRss/77409.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kang/services/trackbacks/77409.html</trackback:ping><description><![CDATA[<p>1、重载是指在同一个类中函数名相同，但参数类型或参数个数不同。对于只有返回值类型不同，大部分编译器不支持。同时，重载函数中切记默认参数的使用，如：int input();与int input(int num=0);在使用input()函数时，编译器不知道调用哪一个函数，而在编译时产生错误。<br>&nbsp;重载可用vitrual关键字修饰，也可不用。<br>2、覆盖是指在基类与其派生类之间，函数的声明一致（参数与返回值类型，以及参数个数），同时基类函数用vitual关键字修饰。<br>3、隐藏是指在基类与其派生类之间，若派生类的函数与基类的函数同名，返回值和参数类型个数也一致，而基类中该函数并未用virtual关键字修饰，此时基类的函数将被隐藏。若基类的函数已用或未用virtual关键字修饰，只要派生类中存在与其同名函数，在返回值或参数类型或个数上不同，基类的函数将被隐藏。</p>
<img src ="http://www.cppblog.com/kang/aggbug/77409.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kang/" target="_blank">kang</a> 2009-03-21 15:43 <a href="http://www.cppblog.com/kang/archive/2009/03/21/77409.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>