最近项目里面经常使用到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 阅读(1934)
评论(1) 编辑 收藏 引用 所属分类:
C++