最近项目里面经常使用到memcpy,使用memcpy的时候,如下代码
 #include<stdio.h>
#include<stdio.h>
 #include<string.h>
#include<string.h>
 int main()
int main()


 {
{
 char * src ="Hello World";
char * src ="Hello World";
 char * dst ="Hello World Again!";
char * dst ="Hello World Again!";
 memcpy(dst,src,sizeof(src));
memcpy(dst,src,sizeof(src));
 return 1;
return 1;
 }
}
报错说内存地址错误..也就是Unhandled exception in .exe:0xC0000005:Access Violation。
     没事就研究了下memcpy ,memcpy在VC6.0版本中的代码如下
 1 void * __cdecl memcpy (
void * __cdecl memcpy (
 2 void * dst,
        void * dst,
 3 const void * src,
        const void * src,
 4 size_t count
        size_t count
 5 )
        )
 6

 {
{
 7 void * ret = dst;
        void * ret = dst;
 8
 9 #if defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC)
#if defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC)
10
 
         {
{
11 extern void RtlMoveMemory( void *, const void *, size_t count );
        extern void RtlMoveMemory( void *, const void *, size_t count );
12
13 RtlMoveMemory( dst, src, count );
        RtlMoveMemory( dst, src, count );
14 }
        }
15 #else  /* defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC) */
#else  /* defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC) */
16
 /**//*
        /**//*
17 * copy from lower addresses to higher addresses
         * copy from lower addresses to higher addresses
18 */
         */
19
 while (count--)
        while (count--)  {
{
20 *(char *)dst = *(char *)src;
                *(char *)dst = *(char *)src;
21 dst = (char *)dst + 1;
                dst = (char *)dst + 1;
22 src = (char *)src + 1;
                src = (char *)src + 1;
23 }
        }
24 #endif  /* defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC) */
#endif  /* defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC) */
25
26 return(ret);
        return(ret);
27 }
}
28
 
实际上 memcpy 使用的代码是从第19行开始的
 void * __cdecl memcpy (
void * __cdecl memcpy (
 void * dst,
        void * dst,
 const void * src,
        const void * src,
 size_t count
        size_t count
 )
        )


 {
{
 void * ret = dst;
        void * ret = dst;

 while (count--)
        while (count--)  {
{
 *(char *)dst = *(char *)src;
                *(char *)dst = *(char *)src;
 dst = (char *)dst + 1;
                dst = (char *)dst + 1;
 src = (char *)src + 1;
                src = (char *)src + 1;
 }
        }
 return(ret);
        return(ret);
 }
}

为了可以进入 中进行调试
我使用以下代码调试到memcpy中 
 #include<stdio.h>
#include<stdio.h>
 void * __cdecl memcpy (
void * __cdecl memcpy (
 void * dst,
        void * dst,
 const void * src,
       const void * src,
 size_t count
       size_t count
 )
        )


 {
{
 void * ret = dst;
        void * ret = dst;


 while (count--)
       while (count--)  {
{
 *(char *)dst = *(char *)src;
               *(char *)dst = *(char *)src;
 dst = (char *)dst + 1;
                dst = (char *)dst + 1;
 src = (char *)src + 1;
                src = (char *)src + 1;
 }
       }
 return(ret);
        return(ret);
 }
}



 int main()
int main()


 {
{
 char * src ="Hello World";
char * src ="Hello World";
 char * dst ="Hello World Again!";
char * dst ="Hello World Again!";
 memcpy(dst,src,sizeof(src));
memcpy(dst,src,sizeof(src));
 return 1;
return 1;
 }
}
最后发现错误出在memcpy函数中
 *(char *)dst = *(char *)src;
*(char *)dst = *(char *)src;
为什么呢?
 char * dst ="Hello World Again!";
char * dst ="Hello World Again!";
这里dst是在文字常量区分配一个字符串常量,再把str1指向它
等于就是
 const char * dst ="Hello World Again!";
const char * dst ="Hello World Again!";
所以这里已给字符指针所指向的字符变量赋值就出错。
如果要想使以上代码顺利运行 可以将main中的代码改为如下代码

 int main()
int main()


 {
{
 char * src ="Hello World";
char * src ="Hello World";
 char * dst =new char[20];
char * dst =new char[20];
 memcpy(dst,src,sizeof(src));
memcpy(dst,src,sizeof(src));
 return 1;
return 1;
 }
}
或者

 int main()
int main()


 {
{
 char * src ="Hello World";
char * src ="Hello World";
 char dst[20];
char dst[20];
 memcpy(dst,src,sizeof(src));
memcpy(dst,src,sizeof(src));
 return 1;
return 1;
 }
}posted on 2010-11-27 23:44 
Mr.Johnson 阅读(1992) 
评论(1)  编辑 收藏 引用  所属分类: 
C++