char * 和 memcpy

char * 和 memcpy

      最近项目里面经常使用到memcpy,使用memcpy的时候,如下代码

#include < stdio.h >
#include
< string .h >
int  main()
{
char * src ="Hello World";
char * dst ="Hello World Again!";
memcpy(dst,src,
sizeof(src));
return 1;
}

报错说内存地址错误..也就是Unhandled exception in .exe:0xC0000005:Access Violation。

     没事就研究了下memcpy ,memcpy在VC6.0版本中的代码如下

 1 void   *  __cdecl memcpy (
 2          void   *  dst,
 3          const   void   *  src,
 4         size_t count
 5         )
 6 {
 7        void * ret = dst;
 8
 9#if defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC)
10        {
11        extern void RtlMoveMemory( void *const void *, size_t count );
12
13        RtlMoveMemory( dst, src, count );
14        }

15#else  /* defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC) */
16        /*
17         * copy from lower addresses to higher addresses
18         */

19        while (count--{
20                *(char *)dst = *(char *)src;
21                dst = (char *)dst + 1;
22                src = (char *)src + 1;
23        }

24#endif  /* defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC) */
25
26        return(ret);
27}

28

实际上 memcpy 使用的代码是从第19行开始的

void   *  __cdecl memcpy (
        
void   *  dst,
        
const   void   *  src,
        size_t count
        )
{
        
void * ret = dst;
        
while (count--{
                
*(char *)dst = *(char *)src;
                dst 
= (char *)dst + 1;
                src 
= (char *)src + 1;
        }

        
return(ret);
}

为了可以进入 中进行调试
我使用以下代码调试到memcpy中 

#include < stdio.h >
void   *  __cdecl memcpy (
        
void   *  dst,
       
const   void   *  src,
       size_t count
        )
{
        
void * ret = dst;

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

        
return(ret);
}




int  main()
{
char * src ="Hello World";
char * dst ="Hello World Again!";
memcpy(dst,src,
sizeof(src));
return 1;
}

最后发现错误出在memcpy函数中

* ( char   * )dst  =   * ( char   * )src;

为什么呢?

char   *  dst  = " Hello World Again! " ;

这里dst是在文字常量区分配一个字符串常量,再把str1指向它
等于就是

const   char   *  dst  = " Hello World Again! " ;

所以这里已给字符指针所指向的字符变量赋值就出错。
如果要想使以上代码顺利运行 可以将main中的代码改为如下代码


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

或者


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

你可能感兴趣的:(char * 和 memcpy)