随笔-10  评论-1  文章-0  trackbacks-0
      最近项目里面经常使用到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版本中的代码如下
 1void * __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;
}
posted on 2010-11-27 23:44 Mr.Johnson 阅读(1941) 评论(1)  编辑 收藏 引用 所属分类: C++

评论:
# re: char * 和 memcpy 2011-03-22 11:20 | 郭英
太牛了,大虾。我正被此问题困扰,拜谢。
  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理