最近项目里面经常使用到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;
}
posted on 2010-11-27 23:44
Mr.Johnson 阅读(1953)
评论(1) 编辑 收藏 引用 所属分类:
C++